0

私は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クラスの注釈を変更するにはどうすればよいですか?

ありがとうございました。

4

1 に答える 1

1

あなたはManyToManyリレーションシップを記述しており、@ManyToManyアノテーションを使用する必要があります。このようなもの:

@Entity
@Table(name="TOPICS")
public class Topic implements Serializable {

    @Id
    @GeneratedValue
    private long topicId;      

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "TOPIC_SPEAKERS",
    joinColumns = {
        @JoinColumn(name = "topicId")},
    inverseJoinColumns = {
        @JoinColumn(name = "speakerId")})
    private Set<Speaker> speakersList;




@Entity
@Table(name="SPEAKERS")
public class Speaker implements Serializable {

    @Id
    @GeneratedValue
    private long speakerId;

    @ManyToMany(mappedBy = "speakersList")
    private Set<Topic> topics;

    private String speakerName;
于 2013-03-14T20:25:41.017 に答える