Java 让jpa一家公司的关系变得有效?
我已经在聊天组件及其聊天消息之间编写了一个非常基本和天真的oneToMany关系,如下所示:Java 让jpa一家公司的关系变得有效?,java,hibernate,orm,jpa,Java,Hibernate,Orm,Jpa,我已经在聊天组件及其聊天消息之间编写了一个非常基本和天真的oneToMany关系,如下所示: @OneToMany List<ChatMessage> chatMessages; 完成任务。只是,查看SQL日志,我可以看到每次都会再次保存整个聊天消息集合。这显然是我负担不起的,因为聊天信息可能会迅速增加到数千条 为每条聊天信息重复的SQL如下所示: Hibernate: insert into BaseComponent_ChatMessage (BaseComponent_id,
@OneToMany
List<ChatMessage> chatMessages;
完成任务。只是,查看SQL日志,我可以看到每次都会再次保存整个聊天消息集合。这显然是我负担不起的,因为聊天信息可能会迅速增加到数千条
为每条聊天信息重复的SQL如下所示:
Hibernate: insert into BaseComponent_ChatMessage (BaseComponent_id, chatMessages_id) values (?, ?)
前面是:
Hibernate: delete from BaseComponent_ChatMessage where BaseComponent_id=?
由此我得出结论,Hibernate没有办法知道我们没有处理一整套新对象,它应该保留它已经拥有的对象
我确信有一种方法可以在关系的许多方面只添加(并保持)一个成员,但我似乎不知道如何添加。覆盖
hashCode
和等于ChatMessage
类的方法,以便Hibernate可以知道这些是相同的对象
使用IDE生成hashCode()和equals()。在Eclipse中,右键单击>源>生成hashCode和equals,然后为您的实体选择属性@Id
另外,尝试将cascade=CascadeType.ALL
属性添加到@OneToMany
我发现,避免每次保存整个聊天消息列表的唯一方法是在聊天组件及其聊天消息之间建立双向关系
@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;
嗨,波佐,这确实很有道理。但是,我可以看到发出的第一条语句是:Hibernate:delete from BaseComponent\u ChatMessage,其中BaseComponent\u id=。。。这似乎表明是ChatComponent(ChatComponent继承自BaseComponent)未被识别为已经存在。我尝试在这两个类中实现hashCode(),只让它返回实体的id。我不确定这是不是一种方法,我也有点困惑在equals方法中该怎么做。不过,谢谢你,这似乎是一个很好的线索:-)嗯,我已经尝试了使用Eclipse在关系的两端生成hashCode和equals的所有可能组合,但是我仍然有n+1个插入:(无论如何,谢谢!尝试添加cascade=CascadeType.ALL属性
@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;
em.getTransaction().begin();
chat.addChatMessage(chatMessage);
em.persist(chat);
em.getTransaction().commit();