2012-11-20 113 views
17

我遇到了幾個很好的可能的答案,但是這是關於從Hibernate 3.4.0GA升級到Hibernate 4.1.8的。所以這用於在以前的版本下工作,我已經搜索了高和低爲什麼它在這個新版本中突破。TransientObjectException - 對象引用未保存的瞬態實例 - 在刷新之前保存瞬態實例

我得到一個

org.hibernate.TransientObjectException:對象引用一個未保存的瞬態的實例 - 沖洗之前保存的瞬態的實例: - > COM com.test.server.domain.model.NoteItem.note。 test.server.domain.model.Note

任何幫助將是偉大的。

這是我的課程。

@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

[對象引用未保存的瞬態實例 - 在刷新之前保存瞬態實例]的可能重複(http://stackoverflow.com/questions/2302802/object-references-an-unsaved-transient-instance-save-the- transient-instance-be) –

回答

30

NoteItem引用它必須被保存之前的過渡(尚未保存)的Note實例。因此,請在屬性說明中指定「Cascade.all」,或者先在Note上調用saveorupdate。

+0

我沒有那樣做,是否有任何教程可用,或者您可以進一步解釋。註釋是如何瞬態的? –

+1

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

相關問題