0

假设我与一个属性有一个多对多的关系。我想用两个一对多的关系来代替它。如果我配置键,我会收到一个奇怪的警告,即主键的属性数量无效。

这是我想要的:

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])

我究竟做错了什么?为什么他希望这是主键的一部分?

4

1 回答 1

0

好的,我第一次尝试回答太微不足道了!

您需要的是一个 UID 主键,Notification它与构成“连接”的外键无关。

有关更具体的示例,请参阅我对这个问题的回答。

于 2013-10-08T02:17:02.187 回答