我正在使用Hibernate 4.2.3,我有一个类似于以下的类:
@Entity
@DynamicInsert
@DynamicUpdate
@SelectBeforeUpdate
public class Test {
@Id
private BigInteger theId;
@Lob
@Basic(fetch = FetchType.LAZY)
@JsonIgnore
private Blob data;
@Lob
@Basic(fetch = FetchType.LAZY)
@JsonIgnore
private Blob otherData;
// Getters and setters....
}
为更新生成的sql包括data
列,即使它没有更改。 (确切地说,我所做的是获取对象,分离它,阅读data
并使用它来生成otherData
,设置它然后在会话上调用saveOrUpdate
。)< / p>
任何人都可以解释为什么会这样吗?这个功能是否适用于Blob?我搜索了文档,但没有找到。
PS我出于性能原因没有使用@DynamicUpdate。我知道从这个角度来看它是值得怀疑的。
答案 0 :(得分:1)
最安全,最便携(在不同数据库和JPA提供程序之间)实现Lobs实际延迟加载的方法是在原始实体和移动Lob的新实体之间创建an artificial lazy one-to-one association。
此方法也适用于其他类型的优化,例如,当我想启用复杂实体的二级缓存时,但实体的几列经常更新。然后我将这些列提取到一个单独的非二级可缓存实体。
但是,请记住特定于一对一关联的一般pitfalls。基本上,要么使用与optional = false
的强制(@PrimaryKeyJoinColumn
)一对一关联映射它,要么确保外键位于声明惰性关联的实体(表)中(在本例中为将Lob移出的原始实体)。否则,这种关联可能会非常渴望,从而违背了引入它的目的。