我在 ChatComponent 和它的 Chat Messages 之间写了一个非常基本和简单的 oneToMany 关系,如下所示:
@OneToMany
List<ChatMessage> chatMessages;
这基本上是有效的,即做类似的事情:
ChatMessage chatMessage = vo.toDomainObject();
chatMessage.setDate(new Date());
//Add the message to the chat component
em.getTransaction().begin();
em.persist(chatMessage);
chat.addChatMessage(chatMessage);
em.persist(chat);
em.getTransaction().commit();
完成工作。只是,查看 SQL 日志,我可以看到每次都会再次持久化整个聊天消息集合。这显然是我负担不起的,因为聊天消息可能很快就会增加到数千条。
为每个聊天消息重复的 SQL 如下:
Hibernate: insert into BaseComponent_ChatMessage (BaseComponent_id, chatMessages_id) values (?, ?)
前面是:
Hibernate: delete from BaseComponent_ChatMessage where BaseComponent_id=?
由此我得出结论,Hibernate 没有办法知道我们不是在处理一整套新对象,它应该保留已有的对象。
我确定有一种方法可以只添加(并保留)关系多方的一个成员,但我似乎无法找到方法。
最佳答案
我发现避免每次都持久化整个聊天消息列表的唯一方法是在聊天组件与其聊天消息之间建立双向关系
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE}, fetch=FetchType.LAZY, mappedBy="parent")
List<ChatMessage> chatMessages;
@ManyToOne
@JoinColumn(name="OWNER_CHAT_COMPONENT_ID", nullable=false)
private ChatComponent parent;
然后在 addChatMessage 函数中,我可以简单地向聊天组件添加一条消息而无需保留它,然后保留聊天组件并且效果很好。
em.getTransaction().begin();
chat.addChatMessage(chatMessage);
em.persist(chat);
em.getTransaction().commit();
关于java - 使 jpa oneToMany 关系有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1795782/