2014-09-12 2 views
0

У меня есть два класса, как эти:Hibernate @ManyToOne отображения: ссылки на объекты неспасенной переходная экземпляра

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 должен быть уже сохранен. Что мне делать?

Фактически, я не хочу использовать каскады. Я хочу управлять SampleSets вручную и не хочу, чтобы изменения в Parent были каскадированы.

+1

проверить для опции каскада в '@ ManyToOne' –

+0

Я не хочу каскада. Я хочу управлять SampleSet вручную. Я не хочу, чтобы изменения были каскадированы. – Shayan

+0

поэтому сохранить s вручную ... –

ответ

0

Попробуйте сначала сохранить SampleSet, а затем сохранить родительский объект.

Добавить session.save(s); перед тем session.save(p);

+0

Во-первых, он должен быть уже сохранен, без необходимости его повторного сохранения. Во-вторых, сеанс уже содержит его. session.contains (s) возвращает true. В-третьих, я сделал session.update (s) без успеха. – Shayan

0

Я думаю, вы должны сначала синхронизировать Parent, а затем сохранить его. Что-то вроде этого:

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

Родитель не сохраняется до – Shayan

0

Проблема была не в фрагменте кода выше. Решил. попытался удалить вопрос, но не удалось. На самом деле у меня были родители List в классе Parent. и SampleSets внутри них не сохранялись.