关于这个谷歌搜索有很多人可以找到,但我还没有找到一个可行的解决方案来解决这个问题.
基本上我所拥有的是一个特定类的大型CLOB,我希望按需加载它.这种天真的方式是:
class MyType {
// ...
@Basic(fetch=FetchType.LAZY)
@Lob
public String getBlob() {
return blob;
}
}
Run Code Online (Sandbox Code Playgroud)
这虽然不起作用,显然是因为我使用的是oracle驱动程序,即Lob对象不被视为简单的句柄,但总是被加载.或者我已经被引导相信我的想法.有一种解决方案使用特殊的工具来进行延迟属性加载,但是由于Hibernate文档似乎表明他们对使这项工作正确无益,所以我宁愿不去那条路.特别是必须运行额外的编译通道和所有.
因此,我设想的下一个解决方案是将此对象分离为另一种类型并定义关联.不幸的是,虽然文档提供了相互矛盾的信息,但很明显,延迟加载对OneToOne与共享主键的关联不起作用.我将关联的一方设置为ManyToOne,但是当有共享主键时,我不太确定如何执行此操作.
所以有人能提出最好的解决方法吗?
不幸的是,下面的代码不起作用.始终检索图像!
@Entity
public Car implements Serializable {
...
@Basic(fetch = FetchType.LAZY) //Neither with @Lob
private byte[] image;
...
}
Run Code Online (Sandbox Code Playgroud)
设置:JPA 2.0/Hibernate 3.5/MySQL 5.5
java.sql.SQLException: could not reset reader
at org.hibernate.lob.ClobImpl.getCharacterStream(ClobImpl.java:100)
at org.hibernate.type.ClobType.set(ClobType.java:70)
at org.hibernate.type.ClobType.nullSafeSet(ClobType.java:141)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2025)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2271)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2688)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
Run Code Online (Sandbox Code Playgroud)
你好,
上面是堆栈跟踪。它可以处理少量数据,但处理大量数据时会失败。我不明白可能是什么问题?
问候,普雷特