【发布时间】: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