0

エンティティ間のone to many関連付けがあります。StudentSubject

Studentエンティティアソシエーションマッピングは

<class name="Student" table="STUDENT">
    <id name="studentId" column="STUD_ID">
        <generator class="increment"/>
    </id>
    <property name="studentName" column="STUD_NAME"/>
   <list access="field" lazy="false" name="subjects" cascade="all-delete-orphan" fetch="subselect">
     <key column="STUD_ID" />
     <list-index column="SUBJECT_ORDER_ID" />
     <one-to-many class="com.sample.Subject" />
    </list>
</class>

サブジェクトテーブルのマッピングは

<class name="Subject" table="SUBJECT">
    <id name="subjectId" column="SUB_ID">
        <generator class="increment"/>
    </id>
   <property name="subjectName" column="SUB_NAME"/>

</class>

テーブルにテーブルレベルの制約がありSUBJECTSTUDENT_IDSUBJECT_ORDER_ID はすべきではありませんnull

ALTER TABLE SUBJECT ADD CONSTRAINT CHK_FIELD CHECK(STUD_ID IS NOT NULL AND SUBJECT_ORDER_ID IS NOT NULL) 

これらのエントリを保存するためのメインクラス

public static void main(String[] args) {
         Session session = HibernateHelper.getSessionFactory().getCurrentSession();
         session.beginTransaction();

          Subject subject = new Subject();
          subject.setSubjectName("Test Subject2");
         // session.save(subject);
          List<Subject> subjects  = new ArrayList<Subject>();
          subjects.add(subject);
         Student student = new Student();
         student.setStudentName("Test student2");
         student.setSubjects(subjects);

         session.save(student);
         session.getTransaction().commit();
    }

Studentエンティティが関連付けられて作成されたときSubjectSubjectHibernateは、空のエンティティを作成STUD_IDSUBJCT_ORDER_ID、後でマッピングを割り当てようとしています。したがって、Subject制約違反のためにエンティティの作成は失敗します。例外ログは

Hibernate: select max(STUD_ID) from STUDENT
Hibernate: select max(SUB_ID) from SUBJECT
Hibernate: insert into STUDENT (STUD_NAME, STUD_ID) values (?, ?)
Hibernate: insert into SUBJECT (SUB_NAME, SUB_ID) values (?, ?)
2012-06-07 17:26:52,484 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Check constraint violation: "CHK_FIELD: ((STUD_ID IS NOT NULL)
    AND (SUBJECT_ORDER_ID IS NOT NULL))"; SQL statement:
insert into SUBJECT (SUB_NAME, SUB_ID) values (?, ?) [23513-164]
2012-06-07 17:26:52,484 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Check constraint violation: "CHK_FIELD: ((STUD_ID IS NOT NULL)
    AND (SUBJECT_ORDER_ID IS NOT NULL))"; SQL statement:
insert into SUBJECT (SUB_NAME, SUB_ID) values (?, ?) [23513-164]
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at com.sample.TestMain.main(TestMain.java:27)
Caused by: org.h2.jdbc.JdbcBatchUpdateException: Check constraint violation: "CHK_FIELD: ((STUD_ID IS NOT NULL)
    AND (SUBJECT_ORDER_ID IS NOT NULL))"; SQL statement:
insert into SUBJECT (SUB_NAME, SUB_ID) values (?, ?) [23513-164]
    at org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:1107)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
    ... 8 more

制約CHK_FIELD:を無効にし、STUD_IDnullSUBJECT_ORDER_ID にしないと、両方のエンティティが正常に作成されます。構成を見逃したかどうかを判断するのを手伝ってください。

4

2 に答える 2

0

注釈uを使用すると、次のようになります-

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "STUDENT_ID",nullable=false)
@ForeignKey(name = "fk_student")     
private List<Subject> subjects= new ArrayList<Subject>();      
于 2012-06-07T10:41:47.927 に答える
0

このエンティティの作成学生と科目は3つのステップで行われます

  1. Studentエンティティを作成します
  2. すべてのサブジェクトエンティティを作成します
  3. すべてのサブジェクトエンティティにSTUD_IDを設定します

サブジェクトエンティティには制約があるため、STUD_IDをnullにしないでください。2番目のステップはこの制約に違反しています。

于 2012-06-26T06:26:35.550 に答える