首页 / JAVA / java-无法将NULL插入列
java-无法将NULL插入列
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-无法将NULL插入列,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4642字,纯文字阅读大概需要7分钟。
内容图文
我正在尝试让Hibernate延迟加载一些Clob.加载部分工作正常.问题是当我尝试创建一个新的时.我从Blob lazy loading的建议开始
这是我的映射(请注意,表结构确实非常糟糕,此表上有多个Clob -本示例从我的真实模型中简化了……).
@Entity @Table("TABLE_1")
public class BadDBDesign {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column("table_id")
private long key;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "table_id", referencedColumnName = "table_id",
insertable = true, updatable = false)
private BlobWrapperA;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "table_id", referencedColumnName = "table_id",
insertable = true, updatable = false)
private BlobWrapperB;
}
@Entity @Table(name = "TABLE_1")
public class BlobWrapperA {
@Lob
@Column(name = "col_A", nullable = false)
@Type(type = "org.springframework.orm.hibernate3.support.BlobByteArrayType")
private byte[] blobColA;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "table_id")
private long Key;
}
@Entity @Table(name = "TABLE_1")
public class BlobWrapperB {
@Lob
@Column(name = "col_B", nullable = false)
@Type(type = "org.springframework.orm.hibernate3.support.BlobByteArrayType")
private byte[] blobColB;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "table_id")
private long Key;
}
应用程序启动正常,能够在不加载Clob的情况下检索数据(能够通过延迟加载在需要时检索它们),但是当我尝试创建新的Clob时,会收到以下stacktrace:
Hibernate:
insert
into
TABLE_1
(key, col_A, col_B)
values
(?, ?, ?)
2011-08-31 17:35:09,089 [http-8080-1] DEBUG org.springframework.jdbc.support.lob.DefaultLobHandler IP134.167.141.34 CV#f2a597b2-a185-4e89 P#71252 - Set bytes for BLOB with length 7136
2011-08-31 17:35:16,441 [http-8080-1] DEBUG org.springframework.jdbc.support.lob.DefaultLobHandler IP134.167.141.34 CV#f2a597b2-a185-4e89 P#71252 - Set bytes for BLOB with length 10946
Aug 31, 2011 5:35:50 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet online threw exception java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("SCHEMA"."TABLE_1"."COL_A")
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1010)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3657)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
注意这一重要的部分,在该部分中,我们在生成的SQL的Hibernate insert语句之后立即看到了Clob的长度.
编辑:在今天清晨看完之后,我意识到问题是由于必须使用@JoinColumn(insertable = false,updatable = false)映射Blob之一,否则Hibernate无法启动.因此,它试图将Null插入此列.因此,新问题变成了,您可以在一个表上懒惰地使用多个Clob(使用相同的键)吗?我猜测没有重新设计表,除非Oracle修复了驱动程序,否则我很不走运.
解决方法:
令我想呕吐的是,我们需要在不修改数据库的情况下获得此功能.
因此,我将常见的片段拉进了Abstract类,如下所示:
@MappedSuperclass @Table("TABLE_1")
public class BadDBDesign {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column("table_id")
private long key;
@Column("small_value")
private String smallVarChar2Field;
}
问题是我必须为每个blob扩展此类:(因此,扩展类看起来像:
public class BlobA extends BadDBDesign {
@Lob @Column("col_a")
@Type(type ="org.springframework.orm.hibernate3.support.BlobByteArrayType")
private byte[] blobColA;
}
public class BlobB extends BadDBDesign {
@Lob @Column("col_b")
@Type(type ="org.springframework.orm.hibernate3.support.BlobByteArrayType")
private byte[] blobColB;
}
幸运的是,在任何给定页面上,我们都没有一个以上的块.这仍然是维护的噩梦,但是(在时间上)这是可以接受的折衷方案,可以更有效地完成负载.我为这些创建了DAO,而该项目以前是没有的.希望这将推动团队朝着正确的抽象层的方向发展,并且我们可以希望在将来的版本中完全删除这些浪费的POJO.
内容总结
以上是互联网集市为您收集整理的java-无法将NULL插入列全部内容,希望文章能够帮你解决java-无法将NULL插入列所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。