java - 使 jpa oneToMany 关系有效?

标签 java hibernate orm jpa

我在 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/

相关文章:

java - 使用 Maven 进行集成测试的最佳实践?

java - Hibernate 没有使用 query.list() 获得正确的记录;

java - Hibernate中级联删除的问题

php - Doctrine ORM 2 选择负数

java - java版本不匹配

java - Short to int 自动提升

java - 使用 hibernate 标准连接复合键

java - Hibernate 对象和 Java 反射

java - 如何添加子选择来选择

c# - 将对象附加到 Telerik OpenAccess 数据上下文时遇到问题