【发布时间】:2011-12-07 02:32:54
【问题描述】:
我遇到了一个关于将实体中的空字段插入数据库的臭名昭著的有趣玩法。
假设我有下表
ID |号码(10) |不为空
Some_Number |号码(25) |可以为空
Some_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: cannot insert NULL into ("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 (?, ?, ?)
传递给语句的参数中有一个空值与 11g 不同,如何在 10g 上获得预期结果?
【问题讨论】:
-
架构 sn-p 中的
some_number列在哪里?另外,您确定两个数据库的架构相同吗? -
抱歉,输入表格时出现拼写错误……我必须在发布之前清理原始代码:)。
-
现在在 10g 数据库上检查模式让我感觉自己像个新手。模式实际上是不同的,似乎 DBA 以外的人一直在修改模式,或者我们的表没有正确流式传输。但这是由 DBA 决定的。
-
@axtavt 如果你愿意,你可以回答,我会接受你的回答,因为我不确定 cmets 是如何工作的......如果不是,我将关闭它。
-
我认为它本身不应该成为一个答案。