我正试图坚持与INSTITType类有很多关系的Institution类对象,并且在持久化时插入null,并且还在数据库表中添加了一些列。
@Table(name="FI")
public class Institution implements Serializable{
@Id
@GeneratedValue
private int id;
private String code;
private String name;
private String address;
private String phone;
private String email;
private String fax;
private InstitutionType type;
private Date regDate;
@ManyToOne
@JoinColumn(name="FI_TYPE_ID", referencedColumnName="ID", nullable=false)
public InstitutionType getType(){ return this.type; }
}
@Table(name="FI_TYPES")
public class InstitutionType implements Serializable{
@Id
@GeneratedValue
private int id;
private String code;
private String name;
public InstitutionType(){};
public void setId(int id){ this.id = id; }
public int getId(){ return this.id; }
public void setCode(String code){ this.code = code; }
public String getCode(){ return this.code; }
public void setName(String name){ this.name = name; }
public String getName(){ return this.name; }
}
这是oracle数据库表模型:
CREATE TABLE "SYSTEM"."FI"
( "ID" NUMBER NOT NULL ENABLE,
"CODE" VARCHAR2(20 BYTE) NOT NULL ENABLE,
"NAME" VARCHAR2(255 BYTE) NOT NULL ENABLE,
"ADDRESS" VARCHAR2(255 BYTE),
"TELEPHONE" VARCHAR2(255 BYTE),
"EMAIL" VARCHAR2(255 BYTE),
"FAX" VARCHAR2(255 BYTE),
"FI_TYPE_ID" NUMBER NOT NULL ENABLE,
"REG_DATE" TIMESTAMP (6) NOT NULL ENABLE,
"PHONE" VARCHAR2(255 CHAR),
CONSTRAINT "FI_PK" PRIMARY KEY ("ID"),
CONSTRAINT "FI_UK1" UNIQUE ("CODE"),
CONSTRAINT "FI_FK1" FOREIGN KEY ("FI_TYPE_ID")
REFERENCES "SYSTEM"."FI_TYPES" ("ID") ENABLE
)
这是跟踪:
javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:93)
at com.vamekh.server.InstitutionServiceImpl.addInstitution(InstitutionServiceImpl.java:28)
at com.vamekh.client.GwtTestproject3.addTemplateTest(GwtTestproject3.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1389)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1317)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:81)
... 24 more
Caused by: 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 org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
... 24 more
Caused by: java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("SYSTEM"."FI"."FI_TYPE_ID")
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10500)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 32 more
运行GWT测试用例后,表格改为:
CREATE TABLE "SYSTEM"."FI"
( "ID" NUMBER NOT NULL ENABLE,
"CODE" VARCHAR2(20 BYTE) NOT NULL ENABLE,
"NAME" VARCHAR2(255 BYTE) NOT NULL ENABLE,
"ADDRESS" VARCHAR2(255 BYTE),
"TELEPHONE" VARCHAR2(255 BYTE),
"EMAIL" VARCHAR2(255 BYTE),
"FAX" VARCHAR2(255 BYTE),
"FI_TYPE_ID" NUMBER NOT NULL ENABLE,
"REG_DATE" TIMESTAMP (6) NOT NULL ENABLE,
"PHONE" VARCHAR2(255 CHAR),
"REGDATE" TIMESTAMP (6), //this column added
"TYPE" RAW(255), //this column added
CONSTRAINT "FI_PK" PRIMARY KEY ("ID"),
CONSTRAINT "FI_UK1" UNIQUE ("CODE"),
CONSTRAINT "FI_FK1" FOREIGN KEY ("FI_TYPE_ID")
REFERENCES "SYSTEM"."FI_TYPES" ("ID") ENABLE
)
哦,我忘了这是log4j日志:
09:23:07,914 INFO SchemaUpdate:155 - Running hbm2ddl schema update
09:23:07,915 INFO SchemaUpdate:167 - fetching database metadata
09:23:08,281 INFO SchemaUpdate:179 - updating schema
09:23:08,394 INFO TableMetadata:65 - table found: SYSTEM.FI
09:23:08,395 INFO TableMetadata:66 - columns: [id, fi_type_id, phone, fax, email, address, regdate, name, code, type, reg_date, telephone]
09:23:08,395 INFO TableMetadata:68 - foreign keys: [fi_fk1]
09:23:08,395 INFO TableMetadata:69 - indexes: [fi_uk1, fi_pk]
09:23:08,415 INFO TableMetadata:65 - table found: SYSTEM.FI_TYPES
09:23:08,415 INFO TableMetadata:66 - columns: [id, name, code]
09:23:08,415 INFO TableMetadata:68 - foreign keys: []
09:23:08,416 INFO TableMetadata:69 - indexes: [fi_types_uk1, fi_types_pk]
09:23:08,435 INFO TableMetadata:65 - table found: SYSTEM.RETURNS
09:23:08,435 INFO TableMetadata:66 - columns: [template, id, fi_id, description, template_id, code, institution]
09:23:08,435 INFO TableMetadata:68 - foreign keys: [fi_template_fk2, fi_id_fk1]
09:23:08,436 INFO TableMetadata:69 - indexes: [return_uk1, return_pk]
09:23:08,454 INFO TableMetadata:65 - table found: SYSTEM.TEMPLATES
09:23:08,454 INFO TableMetadata:66 - columns: [id, schedule, description, code]
09:23:08,454 INFO TableMetadata:68 - foreign keys: []
09:23:08,455 INFO TableMetadata:69 - indexes: [templates_uk1, templates_pk]
09:23:08,456 INFO SchemaUpdate:217 - schema update complete
Hibernate: select institutio0_.id as id2_0_, institutio0_.code as code2_0_, institutio0_.name as name2_0_ from FI_TYPES institutio0_ where institutio0_.id=?
09:23:08,584 TRACE BasicBinder:82 - binding parameter [1] as [INTEGER] - 3
09:23:08,591 TRACE BasicExtractor:71 - found [1] as column [code2_0_]
09:23:08,592 TRACE BasicExtractor:71 - found [test test] as column [name2_0_]
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into FI (address, code, email, fax, name, phone, regDate, type, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
09:23:08,620 TRACE BasicBinder:82 - binding parameter [1] as [VARCHAR] -
09:23:08,621 TRACE BasicBinder:82 - binding parameter [2] as [VARCHAR] - 0003
09:23:08,621 TRACE BasicBinder:82 - binding parameter [3] as [VARCHAR] -
09:23:08,622 TRACE BasicBinder:82 - binding parameter [4] as [VARCHAR] -
09:23:08,622 TRACE BasicBinder:82 - binding parameter [5] as [VARCHAR] - firssq
09:23:08,622 TRACE BasicBinder:82 - binding parameter [6] as [VARCHAR] -
09:23:08,630 TRACE BasicBinder:82 - binding parameter [7] as [TIMESTAMP] - Fri Mar 18 04:58:31 GET 2005
09:23:08,632 TRACE BasicBinder:82 - binding parameter [8] as [VARBINARY] - com.vamekh.shared.InstitutionType@1791b2c
09:23:08,633 TRACE BasicBinder:82 - binding parameter [9] as [INTEGER] - 16
09:23:08,667 WARN JDBCExceptionReporter:233 - SQL Error: 1400, SQLState: 23000
09:23:08,668 ERROR JDBCExceptionReporter:234 - ORA-01400: cannot insert NULL into ("SYSTEM"."FI"."FI_TYPE_ID")
09:23:08,668 WARN JDBCExceptionReporter:233 - SQL Error: 1400, SQLState: 23000
09:23:08,668 ERROR JDBCExceptionReporter:234 - ORA-01400: cannot insert NULL into ("SYSTEM"."FI"."FI_TYPE_ID")
addInstitution: ` EntityManager em;
public InstitutionDTO addInstitution(InstitutionDTO instDTO) {
em = JpaUtil.getEntityManager().createEntityManager();
em.getTransaction().begin();
Institution inst = new Institution(instDTO);
em.persist(inst);
em.getTransaction().commit();
return instDTO;
}`
测试用例:
@Test
public void addTemplateTest(){
InstitutionTypeServiceImpl typeRpc = new InstitutionTypeServiceImpl();
InstitutionServiceImpl instRpc = new InstitutionServiceImpl();
InstitutionTypeDTO typeDTO = typeRpc.getInstitutionType(3);
InstitutionDTO instDTO = new InstitutionDTO("0003", "test", "", "", "", "", typeDTO, new java.sql.Date(1111111111111L));
InstitutionDTO tmpDTO = instRpc.addInstitution(instDTO);
assert(tmpDTO != null);
}
我在创建了insitution时检查了调试器,type is not null