Hibernate是指未保存的瞬态

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

我想我遇到的问题很常见,我已经寻找过类似的问题并尝试过解决方案,但都不管用。我正在开发一个使用hibernate的SpringMVC应用程序。该应用程序有2个类和2个表,Person与Notes有一对多关系。我试图添加一个注释,我得到了以下错误

错误日志:

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);

    }