Pregunta

Hay mucho que uno puede encontrar sobre este googlear un poco, pero todavía no he encontrado una solución viable a este problema.

Básicamente lo que tenemos es un gran CLOB en una clase en particular que quiero tener cargado en la demanda.La ingenua manera de hacer esto sería:

class MyType {

  // ...

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

Que no funciona a pesar de que, al parecer, debido al hecho de que estoy usando controladores de oracle, es decir,Lob objetos no son tratados como simples maneja, pero siempre se cargan.O eso me han conducido a creer de mis incursiones.Hay una solución que utiliza instrumentos especiales para la carga perezosa de propiedades, pero como la Hibernación docs parecen sugerir que están menos interesados en hacer que funcione correctamente, así que prefiero no ir por ese camino.Especialmente con la necesidad de ejecutar un extra de compilar pasar y todo.

Así que la próxima solución que yo había imaginado era la separación de este objeto de otro tipo y la definición de una asociación.Desafortunadamente, mientras que los documentos dan información contradictoria, es evidente para mí que la carga diferida no funciona en OneToOne asociaciones compartidas clave principal.Me gustaría establecer uno de los laterales de la asociación como ManyToOne, pero no estoy muy seguro de cómo hacer esto cuando hay una compartido clave principal.

Así que ¿alguien puede sugerir la mejor manera de ir sobre esto?

¿Fue útil?

Solución

De acuerdo con este única PostgreSQL implementa Blob como muy vago. Por lo que la mejor solución es mover la burbuja a otra mesa. ¿Se tiene que utilizar una clave principal compartida? ¿Por qué no haces algo como esto:

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;
    }
}

Otros consejos

En lugar de hacer equilibristics con anotaciones de hibernación, uno sólo puede tratar de convertir el campo de String en Clob (o 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);  
} 

a mí me funcionó (el campo comenzó a cargar con pereza, en Oracle).

Ya que parecen estar utilizando Hibernate Me pregunto si su problema está relacionado con la siguiente función de hibernación:

Usando Lazy Propiedades Fetching

  

Hibernate3 apoya la recuperación perezosa de propiedades individuales. Esta   técnica de optimización también se conoce como grupos de obtención de información. Tenga en cuenta que   esto es principalmente una función de comercialización; optimizar las lecturas de filas es mucho más   importante que la optimización de la columna se lee. Sin embargo, sólo la carga   algunas propiedades de una clase podrían ser útiles en casos extremos. por   ejemplo, cuando las tablas heredadas tienen cientos de columnas y los datos   modelo no se puede mejorar.

     

Lazy carga propiedad requiere Buildtime código de bytes de instrumentación . Si   sus clases persistentes no se han mejorado, Hibernate ignorar perezoso   configuración de la propiedad y retorno a ir a buscar inmediata.

Instrumentación código de bytes de hibernación El uso de Maven .

Mensaje viejo, pero sólo uno que me ayudó, gracias a la respuesta @TadeuszKopec.

Parece que es difícil de hacer la carga diferida de la burbuja con APP. Probé asociación @OneToOne, pero complica más de ayuda. Me acabo de mudar los bytes a otra clase, sin asociación con MiClase (padre misma mesa, el mismo 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  .....
}

Sólo recuerde para limpiar los padres, antes de guardar la burbuja:

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

Ahora puedo cargar el PDF solo:

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

Estoy principiante con JPA, espero que ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top