2013-04-12 6 views
6

Kiedy automatycznie generuję bazę danych z hibernate.hbm2ddl.auto=create, tworzone jest "niechciane" ograniczenie unikalności w tabeli odwzorowań. Używam PostgreSQL 9.1, instrukcji CREATE TABLE staje:Kolekcja JPA ma niechciane ograniczenia unikalności w tabeli mapowania

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

Niepożądane ograniczeniem jest CONSTRAINT scanalerts_alerts_id_key UNIQUE (alerts_id), w zasadzie chcę tylko wyjątkową presję na scanid i alerts_id.

używam adnotacje WZP, aby utworzyć mapowanie, tutaj jest mój kod:

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

Czy istnieje jakiś sposób, aby zatrzymać utworzenie alert_id unikalność?

Dzięki

@JBNizet Oto alert mapowania adnotacje:

@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

Pokaż nam kod i mapowanie alertu. –

+0

@JBNizet Nie mam odwzorowania w klasie Alert w klasie skanowania, czy powinienem tam też mieć? – user2274508

+0

Nie. Pokaż nam kod i mapowania adnotacji. –

Odpowiedz

7

Jak powiedział dla przykład w JavaDocs, @ElementCollection służy do mapowania kolekcji podstawowych typów lub plików do umieszczenia na stronie. Alert jest jednostką, w związku z czym List<Alert> nie jest zbiorem podstawowych typów lub plików wbudowanych.

powodu korzystne jest UNIQUE, który składa się z scanid i alert_id zakładam, że relacje między Scan i Alert ma wiele-do-wielu naturę. Że można osiągnąć w następujący sposób:

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

klucz podstawowy tabeli zawiera zarówno kolumn i dlatego stosując @UniqueConstraint nie jest potrzebne.

+1

Dzięki Mikko, dokładnie tego chciałem. Chociaż w celu uzyskania utworzenia klucza podstawowego w parametrze alert_id i scan_id, zmieniono listę na zestaw: '@ManyToMany (fetch = FetchType.EAGER) @CollectionTable (name =" scanalerts ", schema = RfidConstants.SCHEMA) @Column (name = "alerts_id") prywatnych Ustawień alertów; ' – user2274508

0

Ograniczenie tworzony jest zadeklarowana tutaj: uniqueConstraints = @UniqueConstraint (columnNames = { "scanid", "alerts_id"}))

prostu usunąć to ograniczenie i zadeklarować wewnątrz podmiotu Alert na każdym atrybucie

+0

'uniqueConstraints = @UniqueConstraint (columnNames = {" scanid "," alerts_id "}))' jest to ograniczenie, które chcę. Bez tego ograniczenia w CollectionTable nadal otrzymuję wyjątkowe ograniczenie nałożone na alert_id. Chcę mieć możliwość ponownego użycia alertów dla wielu skanów, ograniczenie, którego potrzebuję, polega na tym, że jedno skanowanie musi mieć unikalne alerty. Nie jestem pewien, w jaki sposób mogę dodać tę relację do Alertu. – user2274508

+0

sry czytam zbyt szybko, jak nazywa się podmiot deklarujący zbiór? – Gab

Powiązane problemy