である必要があります:私は、次の2つのエンティティ持って同じ
@Entity
@Table(name="user")
public class User {
@Id
@Column("id")
private long id;
@Column(name="code", nullable = false)
private String code;
@Column(name="session_id", nullable = false)
private long sessionId;
}
@Entity
@Table(name="task")
public class Task {
@Id
@Column("id", nullable = false)
private long id;
@ManyToOne(optional = false)
@JoinColumn(name="primary_user_code", referencedColumnName = "code", nullable = "false")
private User primaryUser;
@ManyToOne(optional = true)
@JoinColumn(name="secondary_user_code", referencedColumnName = "code", nullable = "true")
private User secondaryUser;
}
を問題はTask
で2つのUser
のオブジェクトが有していなければならないことです同じsessionId
。休止状態の注釈を使用してこれを強制する方法はありますか?あるいは、弾丸を噛んでコードで強制するだけですか?
私はおそらくUser
すでにことを言及している必要があります更新
@Where
と@WhereJoinTable
注釈に探してみましたが、このバグレポート、linkを休止状態に応じて、それが@ManyToOne
のためにサポートされていません。存在し、変更することはできません。私がコントロールしているのは、私が追加しているTask
クラスです。
コードは一意ではなく、session_idとともに一意のユーザーを識別します。 session_id
は別のテーブルを参照していますが、@OneToOne
の関係が付いていません。これは単純な列であり、Session
テーブルとの関係はコードで処理されます。本質的に各User
にはコードがあり、複数のSessions
にリンクされています。私は追加していタスクテーブルの場合
、私は可能であれば
あなたがここで達成しようとしていることはわかりませんが、あなたが書いたことはまったく問題ないと思います。あなたはTASKテーブルに追加される外部キー列について心配する必要があります。関連する2つのユーザーエンティティの場合、2つの差分があります。外部キー列名、すなわち名前の競合のないprimary_user_codeおよびsecondary_user_code。 UserエンティティのsessionId属性はTASKテーブルにマッピングされないため、名前の競合はありません。 – Ish
質問には直接関係しませんが、あなたの外部キーはユーザの 'code'カラムを指しています。この列はユニークですか?あなたの質問によると、私はあなたの要件が標準のJPAで解決できるとは思わない。関与するエンティティを永続化/マージする前にチェックする必要があります – Al1
これは、カラム定義にunique = trueを追加すると、ほとんどのRDBMでのみ機能します。それでも、それは悪い習慣だと思う:FKは常にPKを指すべきである。 – fhossfel