Java 无法在列中插入NULL

Java 无法在列中插入NULL,java,oracle,hibernate,spring,Java,Oracle,Hibernate,Spring,我正在尝试让Hibernate延迟加载一些CLOB。装载部分工作正常。问题是当我尝试创建一个新的。我从一开始就从他的建议开始 这里是我的映射(注意表结构非常糟糕,这个表上有多个CLOB——这个例子是从我的真实模型简化而来的…) 应用程序启动很好,我可以在不加载CLOB的情况下检索数据(我可以在需要时通过延迟加载检索数据),但当我尝试创建新的CLOB时,我会收到以下stacktrace: Hibernate: insert into TABLE_1 (key, col_

我正在尝试让Hibernate延迟加载一些CLOB。装载部分工作正常。问题是当我尝试创建一个新的。我从一开始就从他的建议开始

这里是我的映射(注意表结构非常糟糕,这个表上有多个CLOB——这个例子是从我的真实模型简化而来的…)

应用程序启动很好,我可以在不加载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长度


编辑:今天早上看了这篇文章后,我意识到问题是由于其中一个blob必须映射为@JoinColumn(insertable=false,updateable=false),否则Hibernate将无法启动。因此,它当然是在试图将Null插入到该列中。因此,新的问题变成了,你能在一张桌子上懒洋洋地多个CLOB(使用相同的键)吗。我猜如果不重新设计表,除非Oracle修复驱动程序,否则我的运气就差了。

在Blobwrapera类中,该列上设置了“nullable=false”。或者该列对数据库中的表本身具有null约束。

Oracle和Hibernate在谈到LOB类型时相互憎恨,这是因为Oracle驱动程序是垃圾。我相信我以前遇到过这种情况,您应该尝试设置以下系统属性:

hibernate.jdbc.use_streams_for_binary=true
hibernate.jdbc.batch_size=0

虽然这让我很想呕吐,但我们需要在不修改数据库的情况下获得此功能

因此,我将常见部分提取到一个抽象类中,如下所示:

@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;
}

幸运的是,我们没有任何位置可以在任何给定页面上创建多个clob。这仍然是一个维护噩梦,但这是一个可以接受的权衡(暂时)更有效地完成负载。我为这些创建了DAO,这是项目之前没有的;希望这将推动团队朝着一个正确的抽象层前进,并且我们希望在未来的版本中完全删除这些浪费的POJO。

您有一个小程序来展示您如何尝试插入这些POJO吗数据?这将有助于查看。不幸的是,我没有。我相信我将不得不这样做,因为这可能是oracle驱动程序的一个问题。我正在尝试使用OracleLobHandler,而不是DefaultLobHandler。插入是通过:getHibernateTemplate().saveOrUpdate(badDBDesign)完成的;不幸的是,这会导致相同的错误,尽管BLOB长度上的日志相同。@Scott,您使用的OracleDialante是否与您使用的Oracle DB版本匹配?我相信Oracle9dialante、Oracle9iDialect和Oracle10gDialante是选项。您是偶然使用11g驱动程序吗?Oracle dialcet设置为10g。我们正在使用11g驱动程序,连接到11g数据库。
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;
}