2013-04-12 43 views
6

Khi tôi tự động tạo cơ sở dữ liệu của mình với hibernate.hbm2ddl.auto=create ràng buộc duy nhất 'không mong muốn' đang được tạo trong bảng ánh xạ. Tôi đang chạy postgres 9.1, các tạo bảng tuyên bố trở thành:Bộ sưu tập JPA có ràng buộc không mong muốn duy nhất trong bảng ánh xạ

CREATE TABLE schemaname.scanalerts 
(
    scanid bigint NOT NULL, 
    alerts_id bigint NOT NULL, 
    CONSTRAINT fkd65bd7541b5b1a8e FOREIGN KEY (scanid) 
     REFERENCES rfid.scan (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT fkd65bd754860b0886 FOREIGN KEY (alerts_id) 
     REFERENCES rfid.alert (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT scanalerts_alerts_id_key UNIQUE (alerts_id), 
    CONSTRAINT scanalerts_scanid_alerts_id_key UNIQUE (scanid , alerts_id) 
) 

Ràng buộc không mong muốn là CONSTRAINT scanalerts_alerts_id_key UNIQUE (alerts_id), về cơ bản tôi chỉ muốn hạn chế duy nhất trên scanid và alerts_id.

Tôi đang sử dụng chú thích JPA để tạo ra các bản đồ, đây là mã của tôi:

@ElementCollection(targetClass = Alert.class, fetch = FetchType.EAGER) 
@CollectionTable(name = "scanalerts", schema = RfidConstants.SCHEMA, 
    joinColumns = @JoinColumn(name = "scanid"), 
    uniqueConstraints = @UniqueConstraint(columnNames = { "scanid", "alerts_id" })) 
private List<Alert> alerts; 

Có cách nào để ngăn chặn việc tạo ra các hạn chế duy nhất alert_id?

Cảm ơn

@JBNizet Đây là Alert lập bản đồ chú thích:

@Entity 
@Table(name = "alert", schema = "schemaname", 
    uniqueConstraints = @UniqueConstraint(columnNames = {"message", "alertPriority"})) 
public class Alert implements Serializable { 

    @Id 
    @Column(name="id") 
    @SequenceGenerator(name = "alertSeq", sequenceName="ALERT_SEQ", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "alertSeq") 
    private Long id; 

    @Column(name="versionnum") 
    @Version 
    private Long version; 

    @Column(name = "message", nullable = false) 
    private String message; 

    @Column(name = "alertpriority", nullable = false) 
    @Enumerated(EnumType.STRING) 
    private AlertPriority alertPriority; 
+1

Vui lòng chỉ cho chúng tôi mã và ánh xạ của Cảnh báo. –

+0

@JBNizet Tôi không có ánh xạ trong lớp Thông báo cho lớp Quét, tôi có nên có một bản đồ ở đó không? – user2274508

+0

No. Nhưng hãy cho chúng tôi thấy các chú thích mã và ánh xạ của nó. –

Trả lời

7

Như đã nói cho ví dụ trong JavaDocs, @ElementCollection được sử dụng để lập bản đồ thu thập các loại cơ bản hoặc các tệp nhúng. Alert là một thực thể và do đó List<Alert> không phải là tập hợp các loại Cơ bản hoặc các tệp nhúng.

Do hạn chế duy nhất mà bao gồm scanidalert_id được ưa thích, tôi cho rằng mối quan hệ giữa ScanAlert không có tính chất nhiều-nhiều. Đó có thể đạt được như sau:

@ManyToMany 
@JoinTable(name = "scanalerts", schema = RfidConstants.SCHEMA, 
    joinColumns = @JoinColumn(name = "scanid"), 
    inverseJoinColumns = @JoinColumn(name = "alert_id") 
) 
private List<Alert> alerts; 

chìa khóa chính của bảng chứa cả cột và đó là lý do tại sao sử dụng @UniqueConstraint là không cần thiết.

+1

Cảm ơn Mikko, đó là chính xác những gì tôi muốn. Mặc dù để tạo khóa chính trên alert_id và scan_id tôi đã đổi Danh sách thành Tập hợp: '@ManyToMany (fetch = FetchType.EAGER) @CollectionTable (name =" scanalerts ", schema = RfidConstants.SCHEMA) @Column (name = "alerts_id") riêng tư Cảnh báo số ; ' – user2274508

0

Các chế tạo được khai báo ở đây: uniqueConstraints = @UniqueConstraint (COLUMNNAMES = { "scanid", "alerts_id"}))

Chỉ cần xóa điều này và tuyên bố ràng buộc bên trong thực thể Cảnh báo trên mỗi thuộc tính

+0

'uniqueConstraints = @UniqueConstraint (columnNames = {" scanid "," warning_id "}))' đây là ràng buộc mà tôi muốn. Nếu không có ràng buộc này trong CollectionTable, tôi vẫn nhận được ràng buộc duy nhất được đặt khi alert_id. Tôi muốn có thể tái sử dụng cảnh báo cho nhiều lần quét, hạn chế tôi cần là một lần quét duy nhất phải có cảnh báo duy nhất. Tôi không chắc làm thế nào tôi có thể thêm mối quan hệ đó vào Alert. – user2274508

+0

Tôi đã đọc quá nhanh, tên của thực thể khai báo bộ sưu tập là gì? – Gab

Các vấn đề liên quan