2

我有一些 POJOS 如下:

  1. 学生.java
  2. 反馈.java
  3. 论坛.java
  4. 解决方案.java
  5. 建议.java

还有一个类,我通过它使用休眠将用户添加到 mysql 数据库。这是执行此操作的方法:

            import java.util.List;
            import org.hibernate.Transaction;
            import java.util.Date;
            import java.util.HashSet;
            import java.util.Set;
            public class HibernateExample 
            {
                public static void main(String[] args)
                {
                    addUser();
                }

                private static void addUser() 
                {
                    Student user = new Student();
                    user.setEmailId("harshal@gmail.com");
                    user.setFname("fd");
                    user.setLname("dsfds");
                    user.setStuId(43);

                    Set<Feedback> feeds=new HashSet<Feedback>();
                    Feedback feed=new Feedback();
                    feed.setFeedId(1);
                    feed.setFeedDate(new Date());
                    feed.setStudent(user);
                    Suggestions suggestions=new Suggestions();
                    suggestions.setSugession("imrove hjds");
                    suggestions.setSugessionId(43);
                    suggestions.setFeedbacks(feeds);
                    feed.setSuggestions(suggestions);
                    feeds.add(feed);
                    user.setFeedbacks(feeds);


                    Set<Forum> forums=new HashSet<Forum>();
                    Forum fo=new Forum();
                    fo.setQuestion("what's the dks?");
                    fo.setQuestionDate(new Date());
                    fo.setQuestionId(23);
                    fo.setQuestionTitle("how rto");

                    Solution solution=new Solution();
                    solution.setSolId(4554);
                    solution.setSolution("get taht girl");
                    fo.setStudent(user);
                    forums.add(fo);
                    solution.setForums(forums);
                    fo.setSolution(solution);

                    user.setFeedbacks(feeds);
                    // 2. Create DAO
                    StudentDAO dao = new StudentDAO();

                    // 3. Start the transaction
                    Transaction tx = dao.getSession().beginTransaction();

                    // 4. Add user
                    dao.save(user);

                    // 5. Commit the transaction (write to database)
                    tx.commit();

                    // 6. Close the session (cleanup connections)
                    dao.getSession().close();
                }
            }   

我得到的错误是:

            WARN: HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.
                Unsaved transient entity: ([Suggestions#43])
                Dependent entities: ([[Feedback#1]])
                Non-nullable association(s): ([Feedback.suggestions])
            Exception in thread "main" org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation: Feedback.suggestions -> Suggestions
                at org.hibernate.action.internal.UnresolvedEntityInsertActions.checkNoUnresolvedActionsAfterOperation(UnresolvedEntityInsertActions.java:135)
                at org.hibernate.engine.spi.ActionQueue.checkNoUnresolvedActionsAfterOperation(ActionQueue.java:240)
                at org.hibernate.internal.SessionImpl.checkNoUnresolvedActionsAfterOperation(SessionImpl.java:709)
                at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:759)
                at org.hibernate.internal.SessionImpl.save(SessionImpl.java:749)
                at org.hibernate.internal.SessionImpl.save(SessionImpl.java:745)
                at StudentDAO.save(StudentDAO.java:32)
                at HibernateExample.addUser(HibernateExample.java:144)
                at HibernateExample.main(HibernateExample.java:15)

尽管该错误看起来不言自明,但在我应该在添加用户方法()中执行操作的顺序中存在一些问题。那么我在这里做错了什么?

4

1 回答 1

2

保存Student导致Feedback和实体都被某种顺序保存,这与依赖于Suggestions的事实无关。FeedbackSuggestions

尝试Suggestions先保存实体,然后再保存Student(这将导致Feedback也被保存,但这次是在 之后 Suggestions),如下所示:

dao.save(feed);
dao.save(user);

您可能会遇到其他顺序错误的保存操作,因此您只需相应地单独保存它们。

于 2013-07-28T10:48:27.677 回答