Hibernate是指未保存的瞬态
我想我遇到的问题很常见,我已经寻找过类似的问题并尝试过解决方案,但都不管用。我正在开发一个使用hibernate的SpringMVC应用程序。该应用程序有2个类和2个表,Person与Notes有一对多关系。我试图添加一个注释,我得到了以下错误 错误日志:Hibernate是指未保存的瞬态,hibernate,spring-mvc,spring-security,Hibernate,Spring Mvc,Spring Security,我想我遇到的问题很常见,我已经寻找过类似的问题并尝试过解决方案,但都不管用。我正在开发一个使用hibernate的SpringMVC应用程序。该应用程序有2个类和2个表,Person与Notes有一对多关系。我试图添加一个注释,我得到了以下错误 错误日志: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance bef
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.journaldev.spring.model.Person
org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:294)
org.hibernate.type.EntityType.getIdentifier(EntityType.java:537)
org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:311)
org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:321)
org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:294)
org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4243)
org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:546)
org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:232)
org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:159)
org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:231)
org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:102)
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:55)
org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
人物模型:
@Entity
@Table(name="person")
public class Person implements UserDetails{
private static final GrantedAuthority USER_AUTH = new SimpleGrantedAuthority("ROLE_USER");
@Id
@Column(name="personid")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "person_seq_gen")
@SequenceGenerator(name = "person_seq_gen",sequenceName = "person_seq")
private int id;
@OneToMany(cascade = CascadeType.ALL,mappedBy = "person1")
private Set<Notes> notes1;
由于我也在使用Spring安全性,我可以为JSP文件设置一个人,在这里我要添加注释,如下所示:
Notes控制器:
@Controller
public class NoteController {
private NotesService notesService;
@Autowired(required=true)
@Qualifier(value="notesService")
public void setNotesService(NotesService notesService){this.notesService=notesService;}
@RequestMapping(value= "/note/add", method = RequestMethod.GET)
public String addNote(@ModelAttribute("notes") Notes p,@AuthenticationPrincipal Person person){
p.setPerson1(person);
this.notesService.addNote(p);
return "redirect:/";
}
注意事项:
@Transactional
@Repository
public class NotesDAOImpl implements NotesDAO{
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sf){
this.sessionFactory = sf;
}
@Override
public void addNote(Notes notes, int id) {
Person person;
notes.setPerson1(person);
Session session = this.sessionFactory.getCurrentSession();
session.saveOrUpdate(notes);
}
个人的
@Transactional
@Repository
public class PersonDAOImpl implements PersonDAO {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sf){
this.sessionFactory = sf;
}
@Override
public void addPerson(Person p) {
Notes notes;
p.setNotes1(notes);
Session session = this.sessionFactory.getCurrentSession();
session.saveOrUpdate(p);
}
这段代码现在只在数据库中创建空白的人,如果我停止保存这个人,那么我会得到上面提到的错误。任何指针都可以。谢谢。您可能应该设置人物和两边音符之间的关联, e、 g.person.setNotes..,notes.setPersonId 如果以这种方式指定对象之间的关联,则保存级联应正常工作,并且关联的两侧应保存在数据库中
好运有许多不同类型的@OneToMany和@manytone关系,这不仅取决于哪一方管理引用,还取决于该关系是单向的还是双向的。请查看此处和此处谢谢您的回复。你是说映射的getter和setter吗?这两个类上都需要getter和setter。但我的意思是,在调用session.saveperson之前,您应该先执行person.setNotesnotes和notes.setPersonperson,然后让hibernate执行级联魔术。希望它现在有意义!您好,我按照您所说的做了,这是有道理的,不幸的是,要么我在初始化单个类时出现了cast错误,要么没有初始化错误。我用NoteDAOImpl和PersonDAOImpl更新了帖子,对吗?你提供的解决方案在我看来不正确。我不知道为什么您创建了2个DAO类并分别保存实体。顺便说一句,这个代码总是失败的人;notes.SetPerson1个人;肯定会导致初始化异常。因此,我建议您使用一个DAO来设置对象之间的关联,并保存唯一自己的一方,最好是关联的所有者,这似乎是您案例中的注释实际上,在一对一或多对一关系中调用person.setNotesnotes和Notes.setPersonperson是没有意义的。如果使用注释正确设置,则只更新关系所有者。在这种情况下,只需调用notes.setPersonperson,hibernate即可完成这项工作。
@Transactional
@Repository
public class PersonDAOImpl implements PersonDAO {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sf){
this.sessionFactory = sf;
}
@Override
public void addPerson(Person p) {
Notes notes;
p.setNotes1(notes);
Session session = this.sessionFactory.getCurrentSession();
session.saveOrUpdate(p);
}