【问题标题】:org.hibernate.PersistentObjectException: detached entity passed to persist while using hashMap to persist objectsorg.hibernate.PersistentObjectException:分离的实体传递给持久化,同时使用 hashMap 持久化对象
【发布时间】:2019-03-02 12:35:12
【问题描述】:

我有一个类 Notification,其中包含一个对象 messengerData:

public class Notification{

    @OneToOne(mappedBy = "messengerDataId")
    private MessengerData messengerData;
    ...
}

MessengerData 类包含资源映射,这意味着 messengerdata 包含一对这就是我使用一对多关系的原因:

public class MessengerData{

        @OneToOne(mappedBy = "messengerData")
        private Notification notification;

        @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE },
                 fetch = FetchType.EAGER)
        @Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH })
        @JoinTable(name = HemisTablesNames.MESSENGER_RESOURCES, joinColumns = @JoinColumn(name = "idResource"),
                 inverseJoinColumns = @JoinColumn(name = "messengerDataId"))

        private Map<String, Resource> resources = new HashMap<String, Resource>();
        ...

Resource 类包含一个地图

    @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE },
        fetch = FetchType.EAGER)
@Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH })
@JoinTable(name = HemisTablesNames.MESSENGER_NOTIF_TEXT_DATA, joinColumns = @JoinColumn(name = "idNTD"),
        inverseJoinColumns = @JoinColumn(name = "idResource"))
private Map<String, NotificationTextData> textDatas;

这是我保存对象的方法:

EntityManager.persist(notification);
EntityManager.commitTransaction();

我的问题是我遇到了这个异常:

无法保存通知:org.hibernate.PersistentObjectException: 传递给持久化的分离实体:com.ubiant.hemis.type.Notification

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 在保存实体的地方添加一些代码
  • 我编辑了我的帖子并添加了我如何保存对象,但我认为问题不是来自于此。
  • Aymen,您要保存的对象 (notification),它是从哪里获得的?
  • 这是我在接收新通知请求时实例化的对象通知,我将其作为 json 对象接收。
  • 如果你实例化通知那么你不能使用持久化,因为产生的对象没有附加到休眠会话。您应该使用merge 而不是persist。详情在这里:stackoverflow.com/a/13837495/2224047

标签: java hibernate jpa persistence


【解决方案1】:

尝试使用这样的东西:

@ElementCollection(targetClass = String.class)
@CollectionTable(name = "MAP")
@MapKeyColumn(name="key")
@Column(name="value")
private Map<String, String> map;

您正试图在没有一些引用的情况下保留一个对象。也许这就是你的问题。

【讨论】:

  • 这没有帮助。
【解决方案2】:

如果您实例化通知,那么您不能使用persist,因为生成的对象未附加到休眠会话。你应该使用merge 而不是persist

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 2023-03-29
    • 2017-05-10
    • 2018-01-05
    • 1970-01-01
    • 2017-09-04
    • 2018-09-10
    • 2013-06-26
    相关资源
    最近更新 更多