代码之家  ›  专栏  ›  技术社区  ›  wds

在hibernate中懒洋洋地加载clob

  •  15
  • wds  · 技术社区  · 17 年前

    关于谷歌搜索,有很多东西可以找到,但我还没有找到一个可行的解决方案。

    class MyType {
    
      // ...
    
      @Basic(fetch=FetchType.LAZY)
      @Lob
      public String getBlob() {
        return blob;
      }
    }
    

    但这不起作用,显然是因为我使用的是oracle驱动程序,即Lob对象不被视为简单句柄,而是始终被加载。或者说,我是从我的突袭中被引导去相信的。有一种解决方案使用特殊的工具来进行惰性属性加载,但Hibernate文档似乎表明,他们对使其正确工作不太感兴趣,所以我不想这样做。尤其是必须运行一个额外的编译过程。

    所以我设想的下一个解决方案是将这个对象分离为另一种类型,并定义一个关联。不幸的是,虽然这些文档提供了相互冲突的信息,但对我来说很明显,延迟加载对具有共享主键的OneTONE关联不起作用。我将关联的一侧设置为manytone,但我不太确定在有共享主键的情况下如何执行此操作。

    那么,有人能建议最好的方法吗?

    4 回复  |  直到 17 年前
        1
  •  8
  •   Tadeusz Kopec for Ukraine yespbs    17 年前

    根据 this 只有PostgreSQL将Blob实现为真正的懒惰。因此,最好的解决方案是将blob移动到另一个表中。您必须使用共享主键吗?你为什么不这样做:

    public class MyBlobWrapper {
        @Id
        public Long getId() {
           return id;
        }
        @Lob
        public String getBlob() {
            return blob;
        }
        @OneToOne(fetch=FetchType.LAZY,optional=false) 
        public MyClass getParent() {
            return parent;
        }
    }
    
        2
  •  5
  •   Jacob Schoen    13 年前

    String 进入 Clob (或 Blob ):

    @Lob  
    @Basic(fetch=FetchType.LAZY)  
    @Column(name = "FIELD_COLUMN")  
    public Clob getFieldClob() {  
      return fieldClob;  
    }  
    
    public void setFieldClob(Clob fieldClob) {  
      this.fieldClob = fieldClob;  
    }  
    
    @Transient  
    public String getField()  
    {  
      if (this.getFieldClob()==null){  
        return null;  
      }  
      try {  
        return MyOwnUtils.readStream(this.getFieldClob().getCharacterStream());  
      } catch (Exception e) {  
        e.printStackTrace();  
      }  
    
      return null;  
    }  
    
    public void setField(String field)  
    {  
      this.fieldClob = Hibernate.createClob(field);  
    } 
    

        3
  •  4
  •   Edwin Dalorzo    12 年前

    由于您似乎正在使用Hibernate,我想知道您的问题是否与以下Hibernate功能有关:

    Using Lazy Properties Fetching

    Hibernate3支持延迟获取单个属性。这 优化技术也称为获取组。请注意 这主要是一种营销特征;优化行读取要多得多 在极端情况下,类的某些属性可能很有用。对于 例如,当旧表有数百列和 模型无法改进。

    惰性属性加载 需要构建时字节码检测 您的持久类没有得到增强,Hibernate将忽略懒惰类

    看见 Bytecode Instrumentation for Hibernate Using Maven .

        4
  •  1
  •   Marco linux    8 年前

    看起来很难用JPA延迟加载blob。我尝试了@OneToOne关联,但它比帮助更复杂。 我只是将字节移动到另一个类中,与MyClass没有关联(父级。相同的表,相同的id):

    @Entity
    @Table(name="MyTable")
    public class MyBlobWrapper{
    
        @Id
        @Column(name = "id") // id of MyTable, same as MyClass
        private Long id;
    
        @Lob
        private byte[] bytes;   
    }
    
    @Entity
    @Table(name="MyTable")
    public class MyClass{
    
        @Id
        @Column(name = "id")
        private Long id;
        // other fields  .....
    }
    

    在保存blob之前,请记住刷新父对象:

     em.persist(parent);
     em.flush();
     em.merge(new MyBlobWrapper(parent_id,new byte[1000]));
    

    String query1 = " select PDF from MyBlobWrapper PDF where PDF.id = :id";
    

    我只是JPA的初学者,希望对你有所帮助。