私はHibernateを研究していますが、Hibernateアノテーションに関連する不明確な状況に直面しています。
2つのエンティティがあるとします。
トピックとスピーカー
1つのトピックが多くの講演者に関係している可能性があります。1つのトピックに複数のスピーカーが含まれる場合があります。また、1人の講演者がいくつかのトピックに参加する場合があります。
以下に示すように:
私のプレーンアプリケーションには、トピッククラスとスピーカークラスの2つのエンティティクラスが含まれています
また、Topicクラスには、TOPIC_SPEAKERSテーブルを介してSPEAKERSとの1対多の関係を宣言するアノテーションが含まれています。TOPIC_SPEAKERSテーブルは、存在しない場合、実行時に生成されます。
Topic.class(関連性のないコードはスキップされます)
@Entity
@Table(name="TOPICS")
public class Topic implements Serializable {
@Id
@GeneratedValue
private long topicId;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "TOPIC_SPEAKERS",
joinColumns = {
@JoinColumn(name = "topicId")},
inverseJoinColumns = {
@JoinColumn(name = "speakerId")})
private List<Speaker> speakersList;
そしてスピーカークラスヘッダー:
@Entity
@Table(name="SPEAKERS")
public class Speaker implements Serializable {
@Id
@GeneratedValue
private long speakerId;
private String speakerName;
SPEAKERSテーブルに2つのレコードを追加しましたが、次のようになります。
次に、最初のスピーカー(John Doe)を参照してTOPICSテーブルに1つのトピックを追加しました。
TOPICS table:
and TOPIC_SPEAKERS table:
最初のスピーカー(John Doe)を参照する別のトピックを追加しようとするまで、すべて正常に機能しました。つまり、TOPICSテーブルに「2番目のトピック」を追加し、「TOPIC_SPEAKERS」の「2番目のトピック」の参照を最初のスピーカー(John Doe)に追加します。
結果のTOPIC_SPEAKERSは次のようになります(65536-John DoeのID):
# TOPICID SPEAKERID
1 131072 65536
2 132111 65536
ただし、Hibernateでは、SPEAKERID値が重複しているレコードをTOPIC_SPEAKERSに挿入することはできません。
そして、次のエラーが発生します。
could not insert collection: [simpledbtest.model.Topic.speakersList#163840]
SEVERE: The statement was aborted because it would have caused a duplicate key value
in a unique or primary key constraint or unique index identified by 'SQL130314230217010'
defined on 'TOPIC_SPEAKERS'.
....
Caused by: java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because
it would have caused a duplicate key value in a unique or primary key constraint or unique
index identified by 'SQL130314230217010' defined on 'TOPIC_SPEAKERS'.
....
Caused by: org.apache.derby.client.am.SqlException: The statement was aborted because it
would have caused a duplicate key value in a unique or primary key constraint or unique index
identified by 'SQL130314230217010' defined on 'TOPIC_SPEAKERS'.
私の質問-生成されたTOPIC_SPEAKERSテーブルで重複する列値を許可するようにTopicクラスの注釈を変更するにはどうすればよいですか?
ありがとうございました。