8

「User」と「Document」の2つのエンティティクラスがあります。各ユーザーには、実際には2つのリストである受信ボックスと送信ボックスがあり、各ドキュメントは複数の受信ボックスと送信ボックスのユーザーに存在する場合があります。これが私のクラスです:

@Entity
public class User {

    @Id
    private Long id;

    @ManyToMany(mappedBy = "userinbox", cascade=CascadeType.ALL)
    private List<Document> inbox = new ArrayList<Document>();
    @ManyToMany(mappedBy = "useroutbox", cascade=CascadeType.ALL)
    private List<Document> outbox = new ArrayList<Document>();

}

@Entity
public class Document {

    @Id
    private Long id;

    @ManyToMany(cascade=CascadeType.ALL)
    private List<User> userinbox  = new ArrayList<User>();
    @ManyToMany(cascade=CascadeType.ALL)
    private List<User> useroutbox  = new ArrayList<User>();

}

プログラムを実行してドキュメントをユーザーの受信トレイに割り当てようとすると(またはその逆)、次のエラーが発生します。

Error Code: 1364

Call: INSERT INTO DOCUMENT_USER (userinbox_ID, inbox_ID) VALUES (?, ?)
    bind => [2 parameters bound]

Internal Exception: java.sql.SQLException: Field 'useroutbox_ID' doesn't have a default value

Query: DataModifyQuery(name="userinbox" sql="INSERT INTO DOCUMENT_USER (userinbox_ID, inbox_ID) VALUES (?, ?)")

生成された関連付けテーブルは次のようになります。

DOCUMENT_USER
useroutbox_ID | outbox_ID |userinbox_ID | inbox_ID

このような多対多の関係にデフォルト値を割り当てるにはどうすればよいですか?2つの関連付けテーブルを作成する方がよいでしょうか->1つは受信トレイの関係用、もう1つは送信トレイの関係用です。どうすればそれを達成できますか?この問題に対する他の解決策は?

どんな助けでも高く評価されます-事前に感謝します!

4

1 に答える 1

16

より良いオプションは、リレーションごとに1つずつ、2つの別々のテーブルを用意することだと思います。実際には、2つの異なるエンティティ間に2つの関係があり、4つの異なるエンティティとの1つの関係ではないためです。

したがって、これらの関係はプロパティにマップされるため、側面@JoinTableの各属性に注釈を追加する必要があります。次のようなもの:DocumentUser

@Entity
public class Document {

    @Id
    private Long id;

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "document_inbox", joinColumns = @JoinColumn(name = "userinbox_id"),
               inverseJoinColumns = @JoinColumn(name = "inbox_id"))
    private List<User> userinbox  = new ArrayList<User>();
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "document_outbox", joinColumns = @JoinColumn(name = "useroutbox_id"),
               inverseJoinColumns = @JoinColumn(name = "outbox_id"))
    private List<User> useroutbox  = new ArrayList<User>();

}

他のエンティティはそのままにしておきます。お役に立てれば。

于 2012-04-06T12:47:54.943 に答える