有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使jpa-oneToMany关系有效?

我已经在聊天组件及其聊天消息之间编写了一个非常基本和天真的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没有办法知道我们没有处理一整套新对象,它应该保留它已经拥有的对象

我确信有一种方法可以在一段关系的许多方面只添加(并保持)一个成员,但我似乎不知道如何添加


共 (2) 个答案

  1. # 1 楼答案

    我发现,避免每次保存整个聊天消息列表的唯一方法是在聊天组件及其聊天消息之间建立双向关系

    @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();
    
  2. # 2 楼答案

    重写ChatMessage类的hashCodeequals方法,以便Hibernate可以知道这些是相同的对象

    使用IDE生成hashCode()和equals()。在Eclipse中,右键单击>;来源>;生成hashCode和equals,并为实体选择@Id属性

    另外,尝试将cascade=CascadeType.ALL属性添加到@OneToMany