2013-04-12 8 views
6

Wenn ich meine Datenbank automatisch generieren mit hibernate.hbm2ddl.auto=create eine ‚unerwünschte‘ eindeutige Einschränkung in einer Zuordnungstabelle erstellt wird. Ich bin mit Postgres 9.1, die create table-Anweisung wird:JPA-Sammlung hat unerwünschte eindeutige Einschränkung in Zuordnungstabelle

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) 
) 

Die unerwünschte Einschränkung ist CONSTRAINT scanalerts_alerts_id_key UNIQUE (alerts_id), im Grunde möchte ich nur die eindeutige Einschränkung auf ScanID und alerts_id.

Ich bin mit JPA Annotationen die Zuordnung zu erstellen, hier ist mein Code:

@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; 

Gibt es eine Möglichkeit, die Erstellung der alert_id eindeutige Einschränkung zu stoppen?

Dank

@JBNizet Hier ist die Alert-Mapping Anmerkungen:

@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

Bitte zeigen Sie uns den Code und die Abbildung von Alert. –

+0

@JBNizet ich keine Zuordnung in der Alert-Klasse an die Scan-Klasse haben, sollte auch ich habe man dort? – user2274508

+0

Nein. Aber zeigen Sie uns seine Code- und Mapping-Annotationen. –

Antwort

7

Wie gesagt für Beispiel in JavaDocs wird @ElementCollection verwendet Sammlung von Grundtypen oder Embeddables abzubilden. Alert ist eine Einheit und damit List<Alert> ist nicht Sammlung von Grundtypen oder Embeddables.

Da eindeutige Einschränkung, die von scanid besteht und alert_id bevorzugt wird, gehe ich davon aus, dass die Beziehung zwischen Scan und Alert ist many-to-many Natur hat. Die kann wie folgt erreicht werden:

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

Primärschlüssel der Tabelle enthalten beiden Spalten und deshalb @UniqueConstraint mit nicht benötigt wird.

+1

Danke Mikko, das war genau das, was ich wollte. Obwohl ich die Primärschlüsselerzeugung auf alert_id und scan_id bekommen habe, habe ich die Liste in einen Satz geändert: '@ManyToMany (fetch = FetchType.EAGER) @CollectionTable (name =" scanalerts ", schema = RfidConstants.SCHEMA) @Column (name = "alerts_id") privat Benachrichtigung; ' – user2274508

0

Die Einschränkung hier erklärt erstellt: uniqueConstraints = @UniqueConstraint (column = { "ScanID", "alerts_id"}))

dies einfach entfernen und erklären, für jedes Attribut innerhalb constraint Meldeeinheit

+0

'uniqueConstraints = @UniqueConstraint (columnNames = {" scanid "," alerts_id "})) Dies ist die Einschränkung, die ich möchte. Ohne diese Einschränkung in der CollectionTable bekomme ich immer noch die einzige Einschränkung, die auf alert_id gesetzt ist. Ich möchte in der Lage sein, Warnungen für viele Scans wiederzuverwenden, die Einschränkung, die ich brauche, ist, dass ein einziger Scan eindeutige Alarme haben muss. Ich bin mir nicht sicher, wie ich diese Beziehung zum Alert hinzufügen könnte. – user2274508

+0

sry Ich lese zu schnell, wie heißt die Entität, die die Sammlung deklariert? – Gab

Verwandte Themen