我已经写了一个非常基础和朴素的一对多关系,它是在聊天组件和其聊天消息之间建立的:
@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无法知道我们不是在处理一整组新对象,并且应该保留已经存在的对象。
我相信有一种方法可以添加(并持久化)关系的多个成员中的一个,但我似乎找不到如何做到。