我有一个User类,一个Conversation类和一个Message类。用户可以是发送者和接收者。 如果我的目标是,我不知道如何设置级联类型:
在我看来,我可以在所有地方设置除CascadeType.Delete之外的所有CascadeType。 我必须手动检查每个删除。我想我无法在用户的消息上设置CascadeType.Delete例如,因为即使删除用户我也想保留它们,并且即使删除会话的所有参与者也要删除它们。 我不确定,但是我认为我无法对用户的邮件设置“孤立删除”,因为如果我删除用户,它将清除邮件列表并删除邮件。
@Entity
class User {
@Id
@GeneratedValue
val id: Long = 0
@OneToMany(mappedBy = "reviewer")
lateinit var conversations: List<Conversation>
@OneToMany(mappedBy = "sender")
lateinit var sentMessages: List<Message>
@OneToMany(mappedBy = "receiver")
lateinit var receivedMessages: List<Message>
}
@Entity
class Conversation {
@Id
@GeneratedValue
val id: Long = 0
@OneToMany(mappedBy = "conversation")
lateinit var messages: List<Message>
}
@Entity
class Message {
@Id
@GeneratedValue
val id: Long = 0
@ManyToOne
lateinit var conversation: Conversation
@ManyToOne
lateinit var sender: User
@ManyToOne
lateinit var receiver: User
lateinit var message: String
}
答案 0 :(得分:0)
您设置的非平凡规则对于Hibernate来说是开箱即用的。
我建议使用DDD聚合和聚合根的概念来分解模型,在聚合内部使用级联并与两者之间的事件进行通信。
我看到两个聚合:User
和Conversation
。 Conversation
聚合由Conversation
作为聚合根和Message
作为附加实体组成。
从Message
中删除User
的列表,并在ConversationRepository
中提供查找方法。
您描述的所有逻辑都进入User
,UserRepository
,Conversation
和ConversationRepository
中的方法中。 User*
类可以委托给ConversationRepository
来操纵Conversation
和Message
。
使用这种方法来实现所需的逻辑应该更容易实现,测试和理解。使用直接SQL而不是JPA可能实际上可以更轻松(甚至更快)地执行许多步骤。当然,您必须注意JPA 1级缓存不会过时。