@Basic(fetch = FetchType.LAZY) does not work?

前端 未结 7 1641
执念已碎
执念已碎 2020-12-17 09:17

I use JPA (Hibernate) with Spring. When i want to lazy load a Stirng property i use this syntax:

@Lob
@Basic(fetch = FetchType.LAZY)
public String getHtmlSum         


        
相关标签:
7条回答
  • 2020-12-17 10:03
    @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;
        }
    }
    

    I use Hibernate4 h2database.I am sure lazy loading can work fine by my code.

    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=?

    if use repository.save(User) to add a new User will be ok, but update a User will throw a exception

    java.lang.ClassCastException: org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer$1 cannot be cast to java.sql.Blob

    I suggest use repository.delete(userid) before repository.save in one transactional, then it will work fine.

    0 讨论(0)
提交回复
热议问题