@Basic(fetch = FetchType.LAZY)不起作用?
我在Spring中使用JPA(Hibernate)。 当我想延迟加载Stirng属性时,我使用以下语法:
@Lob @Basic(fetch = FetchType.LAZY) public String getHtmlSummary() { return htmlSummary; }
但是,当我看到hibernate创建的sql时,似乎这个属性不是延迟加载的? 我也在ANT脚本中使用这个类org.hibernate.tool.instrument.javassist.InstrumentTask来检测这个属性,但似乎它不起作用。
请帮帮我。
在Khosro。
延迟Lob
加载需要字节码检测才能正常工作,因此默认情况下它在我所知道的任何JPA实现中都不可用。
最好的办法是将Lob放入一个单独的实体,如HtmlSummary
,并使用一个懒惰加载的一对一关联。
使用FieldHandled和@Basic @Basic(fetch=FetchType.LAZY)
有效:
public class myFile implements Serializable, FieldHandled { private FieldHandler fieldHandler; @Lob @Basic(fetch = FetchType.LAZY) @Column(name = "CONTENT") protected byte[] content;
@Entity public class User implements FieldHandled { @Id private String uid; private String uname; private int age; @Lob @Basic(fetch = FetchType.LAZY) private byte[] img; private FieldHandler fieldHandler; public User() { } // getter() and setter() of uid, uname, age public byte[] getImg() { // if User user = new User() then fieldHandler is null // if User user = entityManager.find(User.class, "001") then fieldHandler is not null if(img != null) { return img; } if (fieldHandler != null) { return (byte[]) fieldHandler.readObject(this, "img", img); } else { return null; } } public void setImg(byte[] img) { this.img = img; } public void setFieldHandler(FieldHandler fieldHandler) { this.fieldHandler = fieldHandler; } public FieldHandler getFieldHandler() { return fieldHandler; } }
我使用Hibernate4 h2database。我确信延迟加载可以通过我的代码正常工作。
Hibernate: select user0_.uid as uid1_0_0_, user0_.age as age2_0_0_, user0_.uname as uname4_0_0_ from User user0_ where user0_.uid=?
Hibernate: select user_.img as img3_0_ from User user_ where user_.uid=?
如果使用repository.save(User)
添加新用户就可以了,但更新用户会抛出exception
java.lang.ClassCastException: org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer$1 cannot be cast to java.sql.Blob
我建议在一个事务中使用repository.delete(userid)
之前的repository.delete(userid)
,然后它将正常工作。
首先,您应该知道JPA规范明确规定LAZY只是对JPA提供商的暗示,因此它不是强制性要求。
要使基本类型的延迟提取工作,您需要启用字节码增强并将enableLazyInitialization
配置属性显式设置为true
:
org.hibernate.orm.tooling hibernate-enhance-maven-plugin ${hibernate.version} true enhance
根据JPA的规范,他们说即使你使用注释属性来懒散地获取,也不能保证应用,因此属性可能会或可能不会被懒惰地加载(取决于JPA的实现者),但是如果你指定你应该急切地获取它们然后JPA实现者必须急切地加载它们。
底线:@Basic(fetch = FetchType.LAZY)可能有效,也可能无效,取决于JPA实现者。
我认为它类似于EclipseLink,你需要启用编织,否则fetch设置不起作用。 编织需要字节码访问。 这可能会有所帮助: https : //stackoverflow.com/a/18423704/7159396
延迟提取仅适用于对其他实体或实体集合的引用。 它不适用于String或int之类的值。
- 使用Spring AOP配置Hibernate会话
- Hibernate Formula Annotation – MySql函数:INTERVAL,DAY
- Java / Hibernate JPA:InheritanceType.TABLE_PER_CLASS和ID
- 找不到元素’持久性’的声明
- 将jdbc驱动程序添加到类路径
- 在更新分离的对象时,Hibernate可以删除孤立的集合吗?
- java.lang.NoClassDefFoundError:无法初始化类org.com.hibernate.HibernateUtil
- 如何在没有主键的情况下为表或视图执行hibernate映射
- Hibernate实现。 我们支付反思罚款吗?