加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java-无法将NULL插入列

发布时间:2020-12-15 01:19:55 所属栏目:大数据 来源:网络整理
导读:我正在尝试让Hibernate延迟加载一些Clob.加载部分工作正常.问题是当我尝试创建一个新的时.我从Blob lazy loading的建议开始 这是我的映射(请注意,表结构确实非常糟糕,此表上有多个Clob -本示例从我的真实模型中简化了……). @Entity @Table("TABLE_1")publi

我正在尝试让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,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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读