属性と多対多の関係があると仮定します。これを2つの1対多の関係に置き換えたいと思います。キーを構成すると、主キーに無効な数の属性があるという奇妙な警告が表示されます。
これが私が欲しいものです:
User <1:N> Notification <N:1> Thread
user_id
とで構成される複合キーを作成するには、通知が必要であることに注意してくださいthread_id
。
それが私が試したことです:
@Entity
public class Notification implements Serializable {
@EmbeddedId
@AttributeOverrides( {
@AttributeOverride(name = "user_id", column = @Column(nullable = false)),
@AttributeOverride(name = "thread_id", column = @Column(nullable =false))
})
private NotificationPK id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id", insertable = false, updatable = false)
private User user;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "thread_id", insertable = false, updatable = false)
private Thread thread;
}
Threadクラスでは、次のようになります。
@OneToMany(fetch=FetchType.LAZY)
@JoinTable(
name="notifications",
joinColumns=@JoinColumn(name="thread_id")
)
private Set<Notification> notifications = new HashSet<Notification>();
次のように使用NotificationPK
します。
@Embeddable
public class NotificationPK implements Serializable {
Long user_id;
Long thread_id;
}
ただし、起動するとすぐに、次の例外が発生します。
Caused by: org.hibernate.MappingException:
Foreign key (FK4BD694E87364C017:notifications
[notifications_thread_id,notifications_user_id]))
must have same number of columns as the referenced
primary key (notifications
[thread_id,notifications_thread_id,notifications_user_id])
私は何が間違っているのですか?なぜ彼はこれが主キーの一部であると期待しているのですか?