我已经为我的问题找到了一些很好的答案,但这是关于从Hibernate 3.4.0GA升级到Hibernate 4.1.8的问题。因此,这在以前的版本中一直有效,我一直在高低搜寻其在新版本中的重要性。
我得到一个
org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例- 在刷新之前保存该瞬态实例:com.test.server.domain.model.NoteItem.note-> com.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(); } }
NoteItem引用Note必须先保存的瞬态(尚未保存)实例。因此,请在属性注释上指定“ Cascade.all”,或先在注释上调用saveorupdate。
NoteItem
Note