2013-04-12 22 views
6

hibernate.hbm2ddl.auto=createでデータベースを自動生成すると、マッピングテーブルに「望ましくない」一意制約が作成されています。私はPostgresの9.1を実行しています、create table文は次のようになります。JPAコレクションにマッピングテーブルの一意性制約がありません

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

アラートのコードとマッピングを教えてください。 –

+0

@JBNizet Alertクラスのスキャンクラスへのマッピングはありません。 – user2274508

+0

いいえ。しかし、そのコードとマッピング注釈を表示してください。 –

答えて

7

にアラートエンティティ内で制約を宣言JavaDocsの例では、@ElementCollectionを使用して、基本タイプまたは埋め込み可能オブジェクトのコレクションをマップします。 Alertはエンティティであるため、 List<Alert>は基本型または埋め込み型のコレクションではありません。

scanidalert_idで構成されてユニーク制約が好まれているので、私はScanAlertとの関係は、多対多の性質を持っていることを前提としています。それは次のよう を達成することができます。テーブルの

@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でプライマリキーを作成するには、リストをSetに変更しましたが、 @ManyToMany(fetch = FetchType.EAGER) @CollectionTable(name = "scanalerts"、schema = RfidConstants.SCHEMA) @Column name = "alerts_id") プライベートセット警告; ' – user2274508

0

作成制約がここに宣言されている: uniqueConstraints = @UniqueConstraint(COLUMNNAMES = { "SCANID"、 "alerts_id"}) )

のために言ったようにただ、これを削除して、各属性

+0

'uniqueConstraints = @UniqueConstraint(columnNames = {" scanid "、" alerts_id "}))'これは私が望む制約です。 CollectionTableにこの制約がなければ、alert_idに固有の制約が適用されます。私は多くのスキャンでアラートを再利用できるようにするために、必要な制約は、1回のスキャンでユニークなアラートが必要であることです。その関係をどのようにしてアラートに追加することができるかわかりません。 – user2274508

+0

sry私は速すぎます。コレクションを宣言するエンティティの名前は何ですか? – Gab

関連する問題