Я пытаюсь заставить Hibernate лениво загрузить некоторые сабы.Загрузочная часть работает просто отлично.Проблема в том, когда я пытаюсь создать новый.Я начал с совета от Blob lazy loading
Вот мои отображения (Обратите внимание, что структура таблицы действительно очень плохая, в этой таблице несколько сгустков - этот пример упрощен от моего реальногомодель ...).
@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;
}
Приложение загружается просто отлично, я могу получить данные без загрузки сгустков (могу получить их при необходимости с помощью отложенной загрузки), но когда я пытаюсь создатьновые я получаю следующую трассировку стека:
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)
Обратите внимание на важную часть, где мы видим длины сгустков сразу после оператора вставки Hibernate из сгенерированного SQL.
Редактировать: Посмотрев на это рано утром, я понял, что проблема была в том, что один из BLOB-объектов должен был отображаться с помощью @JoinColumn (inserttable = false, updatable = false), иначе Hibernate не запустится.Таким образом, конечно, он пытался вставить Null в этот столбец.Таким образом, возникает новый вопрос, можете ли вы лениво MULTIPLE сгустки на одной таблице (используя тот же ключ).Я предполагаю, что без редизайна таблицы мне не повезет, если Oracle не исправит драйвер.