@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;
}
}
Io uso Hibernate4 h2database.I sono sicuro lazy loading può funzionare bene per il mio codice.
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=?
se l'uso repository.save(User)
per aggiungere un nuovo utente sarà ok, ma aggiornare un utente sarà un'eccezione
java.lang.ClassCastException: org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer$1 cannot be cast to java.sql.Blob
suggerisco l'uso repository.delete(userid)
prima dello repository.save
in una transazione, quindi funzionerà correttamente.
Non è vero, LOB può essere pigro-caricato. Vedere la Sezione 2.2.2.1 della documentazione di hibernate-annotations: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e342 - in particolare la proprietà 'detailedComment' su quell'esempio e la nota sotto di esso. – Cowan