JPA插入和可怕的ORA-01400:无法在表名异常中插入NULL

时间:2011-10-13 16:03:13

标签: oracle hibernate jpa

我在臭名昭着的从实体插入空字段到数据库的过程中遇到了一个有趣的游戏。

说我有下表

  

ID |数(10)|不是空的

     

Some_Number |数(25)|可空

     

Some_Date | DATE默认值(sysDate)|可空

我有以下实体

@Entity
@Table(name="SOME_TABLE")
public class MockEntity implements Serializable{

private static final long serialVersionUID = 1L;
@Id
@Column(name="ID", nullable=false)
private Long myId;
@Column(name="SOME_NUMBER")
private Long someNumber;
@Column(name="SOME_DATE")
private Date someDate;


//Basic getters and setters here    

}

我的persistence.xml中的Perssitence Uint如下

 <persistence-unit name="someSortOfPU" transaction-type="RESOURCE_LOCAL">
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
         <property name="show_sql" value="true"/>
         <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="javax.persistence.jdbc.url" value="someUrl"/>
         <property name="javax.persistence.jdbc.user" value="someUser"/>
        <property name="javax.persistence.jdbc.password" value="somePassword"/>
      </properties>
   </persistence-unit>

测试用例是持有一个带有ID和日期的MockEntity对象,没有设置SomeNumber

MockEntity testEntity = new MockEntity();
testEntity.setMyId(999999l);
testEntity.setSomeDate(new Date());

当我将ojdbc14.jar与Oracle 10g数据库一起使用时,我的junit会出现以下错误

引起:java.sql.BatchUpdateException:ORA-01400:无法插入NULL(“SOME_TABLE”。“SOME_NUMBER”)

当我将ojdbc14.jar与Oracle 11g数据库一起使用时,我的junit成功完成。该行存在于表中。

我试图使用ojbc5.jars希望这个问题消失,但没有运气。

Oracle 10g是否解释了Hibernate生成的sql:

insert into SOME_TABLE (ID, SOME_NUMBER, SOME_DATE) values (?, ?, ?)

其中传递给语句的参数中的null与11g不同,如何在10g上获得预期的结果?

1 个答案:

答案 0 :(得分:1)

@axtavt是正确的......架构是不同的。因为没有从源头开始我的故障排除,我脸上的蛋!