2013-04-12 3 views
6

Когда я автоматически создаю свою базу данных с hibernate.hbm2ddl.auto=create, в таблице сопоставлений создается «нежелательное» уникальное ограничение. Я бегу Postgres 9.1, то создание таблицы утверждение становится:JPA Collection имеет нежелательное уникальное ограничение в таблице сопоставления

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

Нежелательный ограничение CONSTRAINT scanalerts_alerts_id_key UNIQUE (alerts_id), в основном я только хочу уникальное ограничение на scanid и alerts_id.

Я использую JPA аннотации, чтобы создать отображение, вот мой код:

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

Есть ли способ, чтобы остановить создание alert_id ограничения уникальности?

Благодаря

@JBNizet Вот настороже отображение аннотаций:

@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

Пожалуйста, покажите нам код и карту Alert. –

+0

@JBNizet У меня нет сопоставления в классе Alert классу Scan, должен ли я там тоже есть? – user2274508

+0

Нет. Но покажите нам свои аннотации кода и отображения. –

ответ

7

Как сказал для пример в JavaDocs, @ElementCollection используется для отображения коллекции базовых типов или вложений. Alert является юридическим лицом и, следовательно, List<Alert> не представляет собой базовые типы или встраиваемые.

Поскольку ограничение уникальности, которое состоит из scanid и alert_id является предпочтительным, я полагаю, что отношения между Scan и Alert действительно имеет много-ко-многим природы. Это может быть достигнуто следующим образом:

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

Первичный ключ таблицы содержит обе колонки, и поэтому использование @UniqueConstraint не требуется.

+1

Спасибо Микко, это было именно то, что я хотел. Хотя для создания первичного ключа в alert_id и scan_id я изменил список на набор: '@ManyToMany (fetch = FetchType.EAGER) @CollectionTable (name =" scanalerts ", schema = RfidConstants.SCHEMA) @Column (name = "warn_id") private Set оповещения; ' – user2274508

0

Ограничение создается объявляется здесь: uniqueConstraints = @UniqueConstraint (columnNames = { "scanid", "alerts_id"}))

Просто удалите это и объявить ограничение внутри объекта оповещения на каждый атрибуте

+0

'uniqueConstraints = @UniqueConstraint (columnNames = {" scanid "," warn_id "}))' Это ограничение, которое я хочу. Без этого ограничения в CollectionTable я все равно получаю уникальное ограничение, установленное на alert_id. Я хочу, чтобы иметь возможность повторно использовать оповещения для многих сканирований, мне нужно ограничение, чтобы одно одиночное сканирование должно иметь уникальные предупреждения. Я не уверен, как добавить это отношение к Alert. – user2274508

+0

sry Я читал слишком быстро, как называется объект, объявляющий коллекцию? – Gab

Смежные вопросы