Hibernate关联在实体创建期间违反约束

时间:2012-06-07 10:31:11

标签: sql hibernate

我与one to many实体有Student个关联Subject实体。

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>

我在SUBJECT表格中有一个表级限制,STUDENT_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创建Subject实体时。 Hibernate尝试使用空SubjectSTUD_ID创建SUBJCT_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_IDSUBJECT_ORDER_ID不应该为空,两个实体都已成功创建。 请帮我弄清楚我是否错过了任何配置?

2 个答案:

答案 0 :(得分:0)

使用注释你可以这样做 -

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "STUDENT_ID",nullable=false)
@ForeignKey(name = "fk_student")     
private List<Subject> subjects= new ArrayList<Subject>();      

答案 1 :(得分:0)

此实体创建学生和主题分三步完成

  1. 创建学生实体
  2. 创建所有主题实体
  3. 在所有主题实体中设置STUD_ID
  4. 由于Subject实体具有约束,因此STUD_ID不应为null。第二步违反了这一限制。