org.hibernate.PersistentObjectException:在使用hashMap持久化对象时传递的持久化分离实体

时间:2018-09-26 16:52:47

标签: java hibernate jpa persistence

我有一个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

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

尝试使用类似这样的内容:

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

您正在尝试保留没有引用的对象。也许那是你的问题。

答案 1 :(得分:0)

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