java-使jpa oneToMany关系有效吗?

我在ChatComponent及其聊天消息之间编写了一个非常基本且幼稚的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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值