【问题标题】:Hibernate @ManyToOne mapping: object references an unsaved transient instanceHibernate @ManyToOne 映射:对象引用了一个未保存的瞬态实例
【发布时间】:2014-09-12 07:51:12
【问题描述】:

我有两个这样的课程:

public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "DBId")
    private Long DBId = null;

    @ManyToOne(fetch = FetchType.EAGER)
    @LazyToOne(LazyToOneOption.FALSE)
    private SampleSet samples;
}

public class SampleSet {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "DBId")
    private Long DBId = null;

    private String uniqueId;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "SampleSet_samplesSet")
    private Set<String> samplesSet = new TreeSet<>();
}

我有这样的代码:

public void modifyAndSaveParent(Parent p, Session session) {
    SampleSet s = (SampleSet) session.getNamedQuery("SampleSet.loadByUniqueId").setParameter("uniqueId", p.getSampleSet().getUniqueId()).uniqueResult();
    if (s == null)
        throw new RuntimeException();
    else
        p.setSampleSet(s);

    session.save(p);
    session.flush();
}

问题是session.flush()上抛出了异常:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: SampleSet
        at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:249)
        at org.hibernate.type.EntityType.getIdentifier(EntityType.java:509)
        at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:309)
        at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:319)
        at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:294)
        at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4051)
        at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:535)
        at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:235)
        at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:164)
        at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:228)
        at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:100)
        at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
        at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1240)

但如您所见,SampleSet 必须已被持久化。我该怎么办?

事实上,我不想使用级联。我想手动管理 SampleSet,不希望对 Parent 的更改被级联。

【问题讨论】:

  • 检查@ManyToOne中的级联选项
  • 我不想要级联。我想手动管理 SampleSets。我不希望级联更改。
  • 所以手动保存...
  • 当我通过查询检索它时,它肯定被保存了
  • 可能该对象已保存但未在相关对象中刷新。所以对象不处于托管状态。也许刷新操作会有所帮助。排除级联的任何原因?

标签: java hibernate hibernate-mapping many-to-one


【解决方案1】:

尝试先保存您的 SampleSet,然后再保存父对象。

session.save(p);之前添加session.save(s);

【讨论】:

  • 首先,它必须已经持久化了,不需要再次保存。其次,会话已经包含它。 session.contains(s) 返回真。第三,我做了一个 session.update(s) 没有成功。
【解决方案2】:

我认为您应该先同步 Parent 然后保存。类似的东西:

p = (Parent) session.load(Parent.class, p.getId());
p.setSampleSet(s);
session.save(p);
session.flush();

【讨论】:

  • 父级之前没有持久化
【解决方案3】:

问题不在上面的代码 sn-p 中。解决了。试图删除问题但没有成功。 事实上,我在 Parent 类中有一个 List parents。并且其中的 SampleSets 没有被持久化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2014-05-16
    • 1970-01-01
    • 2013-08-19
    • 2015-05-29
    • 2022-01-02
    • 2011-04-12
    相关资源
    最近更新 更多