@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;
}
}
tôi sử dụng Hibernate4 h2database.I chắc chắn tải lười biếng có thể hoạt động tốt bởi mã của tôi.
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=?
nếu sử dụng repository.save(User)
để thêm một tài khoản mới sẽ được ok, nhưng cập nhật một tài khoản sẽ ném một ngoại lệ
java.lang.ClassCastException: org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer$1 cannot be cast to java.sql.Blob
tôi đề nghị sử dụng repository.delete(userid)
trước repository.save
trong một giao dịch, khi đó giao dịch sẽ hoạt động tốt.
Không đúng sự thật, LOB có thể được tải chậm. Xem Phần 2.2.2.1 của tài liệu chú thích hibernate-chú thích: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e342 - đặc biệt là thuộc tính'CommentComment 'trên ví dụ đó và ghi chú bên dưới. – Cowan