2012-11-20 6 views
17

Ich habe einige gute Antworten auf meine Fragen gefunden, aber es handelt sich um ein Upgrade von Hibernate 3.4.0GA auf Hibernate 4.1.8. So arbeitete das unter der vorherigen Version und ich habe hoch und niedrig danach gesucht, warum es in dieser neuen Version bricht.TransientObjectException - Objekt verweist auf eine nicht gespeicherte vorübergehende Instanz - speichert die vorübergehende Instanz vor dem Löschen

Ich bekomme ein

org.hibernate.TransientObjectException: Objekt verweist auf eine nicht gespeicherte transiente Instanz - die transiente Instanz speichert vor dem Spülen: com.test.server.domain.model.NoteItem.note -> com. test.server.domain.model.Note

Jede Hilfe wäre großartig.

Hier sind meine Klassen.

@MappedSuperclass 
public abstract class EntityBase implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    protected Long id; 

    @Version 
    @Column(name = "VERSION") 
    protected Long version; 

    public Long getId() { 
     return id; 
    } 

    public Long getVersion() { 
     return version; 
    } 

    protected static final EntityManager entityManager() { 
     return EntityManagerUtil.getEntityManager(); 
    } 
} 

@Entity 
@Table(name = "WORK_BOOK") 
public class WorkBook extends EntityBase { 
    private static final long serialVersionUID = 1L; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "NOTE_ID") 
    private Note note; 

    public WorkBook() { 
     super(); 
    } 

    public Note getNote() { 
     return note; 
    } 

    public void setNote(Note note) { 
     this.note = note; 
    } 

    public WorkBook persist() { 
     EntityManager em = entityManager(); 
     EntityTransaction tx = em.getTransaction(); 

     if (tx.isActive()) { 
      return em.merge(this); 
     } else { 
      tx.begin(); 
      WorkBook saved = em.merge(this); 
      tx.commit(); 
      return saved; 
     } 
    } 
} 

@Entity 
@Table(name = "NOTE") 
public class Note extends EntityBase { 
    private static final long serialVersionUID = 1L; 

    @OneToOne(mappedBy = "note") 
    private WorkBook workBook; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "note") 
    private List<NoteItem> notes = new ArrayList<NoteItem>(); 

    public WorkBook getWorkBook() { 
     return workBook; 
    } 

    public List<NoteItem> getNotes() { 
     return notes; 
    } 

    public void setWorkBook(WorkBook workBook) { 
     this.workBook = workBook; 
    } 

    public void setNotes(List<NoteItem> notes) { 
     if (notes != null) { 
      for (NoteItem ni : notes) { 
       ni.setNote(this);    
      } 
     } 

     this.notes = notes; 
    } 
} 

@Entity 
@Table(name = "NOTE_ITEM") 
public class NoteItem extends EntityBase { 
    private static final long serialVersionUID = 1L; 

    @Column(name = "NOTE_NAME") 
    private String noteName; 

    @Column(name = "NOTE_TEXT") 
    private String noteText; 

    @Column(name = "NOTE_DATE") 
    private Date noteDate; 

    @Column(name = "NOTE_CREATOR") 
    private String noteCreator; 

    @Column(name = "NOTE_CREATOR_ID") 
    private Integer noteCreatorId; 

    @ManyToOne 
    @JoinColumn(name = "NOTE_ID", updatable = true) 
    private Note note; 

    public String getNoteName() { 
     return noteName; 
    } 

    public void setNoteName(String noteName) { 
     this.noteName = noteName; 
    } 

    public String getNoteText() { 
     return noteText; 
    } 

    public void setNoteText(String noteText) { 
     this.noteText = noteText; 
    } 

    public Date getNoteDate() { 
     return noteDate; 
    } 

    public void setNoteDate(Date noteDate) { 
     this.noteDate = noteDate; 
    } 

    public String getNoteCreator() { 
     return noteCreator; 
    } 

    public void setNoteCreator(String noteCreator) { 
     this.noteCreator = noteCreator; 
    } 

    public Integer getNoteCreatorId() { 
     return noteCreatorId; 
    } 

    public void setNoteCreatorId(Integer noteCreatorId) { 
     this.noteCreatorId = noteCreatorId; 
    } 

    public Note getNote() { 
     return note; 
    } 

    public void setNote(Note note) { 
     this.note = note; 
    } 

    public NoteItem create() { 
     return new NoteItem(); 
    } 
} 
+1

möglich Duplikat von [Objektreferenzen eine nicht gespeicherte vorübergehende Instanz - speichern Sie die vorübergehende Instanz vor dem Löschen] (http://stackoverflow.com/questions/2302802/object-references-an-unsaved-transient-instance-save-the- transient-instance-be) –

Antwort

30

NoteItem verweist auf eine transiente (noch nicht gespeichert) Instanz Note, die zuvor gespeichert werden muss. Geben Sie "Cascade.all" in der Eigenschaft note an oder rufen Sie saveorupdate für Note zuerst auf.

+0

ich habe das nicht verstanden, gibt es irgendein tutorial oder du kannst weiter erklären. Wie Note ist vorübergehend? –

+1

'NoteItem noteItem =; noteItem.Note = new Hinweis(); session.Save (noteItem); ' – Firo