8

hibernate.hbm2ddl.auto=create「不要な」一意制約を使用してデータベースを自動生成すると、マッピング テーブルに作成されます。postgres 9.1 を実行しています。create table ステートメントは次のようになります。

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

2 に答える 2

10

たとえば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する必要はありません。

于 2013-04-12T18:00:23.480 に答える