假设我与一个属性有一个多对多的关系。我想用两个一对多的关系来代替它。如果我配置键,我会收到一个奇怪的警告,即主键的属性数量无效。
这是我想要的:
User <1:N> Notification <N:1> Thread
user_id
您应该注意,我需要通知才能拥有一个由and组成的复合键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])
我究竟做错了什么?为什么他希望这是主键的一部分?