2

次のような POJOS がいくつかあります。

  1. 学生.java
  2. フィードバック.java
  3. フォーラム.java
  4. ソリューション.java
  5. 提案.java

休止状態を使用して mysql データベースにユーザーを追加するクラスがもう 1 つあります。これを行うメソッドは次のとおりです。

            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)

エラーは自明のように見えますが、add user method() で操作を実行する順序に問題があります。それで、私はここで何が間違っていますか?

4

1 に答える 1

2

を保存すると、 とエンティティStudentの両方が に依存しているという事実とは関係のない順序で保存されます。FeedbackSuggestionsFeedbackSuggestions

Suggestions最初にエンティティを保存してから、 のみを保存してみてくださいStudent(これにより、Feedbackも保存されますが、今回は の後に Suggestions)、次のようになります。

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

追加の順序の悪い保存操作が発生する可能性があるため、それに応じて個別に保存する必要があります。

于 2013-07-28T10:48:27.677 に答える