Frage

Es gibt viel man über diese googeln etwas finden kann, aber ich habe festgestellt, nicht ganz eine praktikable Lösung für dieses Problem.

Im Grunde, was ich habe, ist ein großer CLOB auf einer bestimmte Klasse, die ich bei Bedarf geladen werden soll. Die naive Art und Weise, dies zu tun wäre:

class MyType {

  // ...

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

Das ist allerdings nicht funktioniert, offenbar aufgrund der Tatsache, ich Orakel Treiber bin mit, das heißt LOB-Objekte sind nicht so einfach Griffe behandelt, sondern sind immer geladen. Oder so habe ich geführt worden von meinen Streifzügen zu glauben. Es gibt eine Lösung, die spezielle Instrumente für faule Immobilien Laden verwendet, sondern als Hibernate scheinen docs vorschlagen, sie sind weniger als daran interessiert, dass die Arbeit richtig zu machen, so dass ich lieber nicht diesen Weg gehen. Gerade bei mit einem zusätzlichen Kompilierung Pass und alle laufen.

Also das nächste Lösung, die ich in Betracht gezogen hatte, wurde auf eine andere Art dieses Objekt zu trennen und eine Verbindung zu definieren. Leider, während die Dokumentation Informationen geben widersprüchliche, dann ist es mir klar, dass verzögertes Laden nicht mit gemeinsamen Primärschlüssel auf OneToOne Verbände arbeiten. Ich würde eine Seite des Vereins als ManyToOne gesetzt, aber ich bin mir nicht ganz sicher, wie dies zu tun ist, wenn es ein gemeinsamer Primärschlüssel ist.

So kann jemand empfehlen, den besten Weg, um dies zu realisieren?

War es hilfreich?

Lösung

Nach dieser nur PostgreSQL implementiert Blob als wirklich faul. So ist die beste Lösung ist, den Blob an einem anderen Tisch zu bewegen. Müssen Sie einen gemeinsamen Primärschlüssel verwenden? Warum tun Sie nicht so etwas wie folgt aus:

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

Andere Tipps

Statt Equilibristik mit Hibernate Annotations tun, kann man nur versuchen, das Feld von String in Clob Umwandlung (oder 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);  
} 

für mich gearbeitet (das Feld begann gemächlich zu laden, auf Oracle).

Da Sie scheinen zu Hibernate Ich frage mich, ob das Problem auf die folgende Hibernate-Funktion bezogen werden:

Mit Faulen Eigenschaften Fetching

  

Hibernate3 unterstützt die faulen Abrufen von individuellen Eigenschaften. Diese   Optimierungstechnik wird auch als Abrufgruppen bekannt. Bitte beachte, dass   dies ist vor allem ein Marketing-Funktion; Zeile liest Optimierung ist viel mehr   Wichtiger als die Optimierung der Spalte liest. Allerdings nur Laden   einige Eigenschaften einer Klasse könnten im Extremfall nützlich sein. Zum   Wenn beispielsweise Legacy-Tabellen haben Hunderte von Spalten und Daten   Modell kann nicht verbessert werden.

     

Faule Eigenschaft Laden erfordert Buildtime-Bytecode Instrumentierung . Wenn   Ihre persistenten Klassen nicht verstärkt werden, werden Hibernate faul ignorieren   Eigenschaftseinstellungen und Rückkehr zum sofortigen Abruf.

Siehe Bytecode Instrumentation für Hibernate Mit Maven .

Alte Post, aber nur eine, die mir geholfen, dank @TadeuszKopec Antwort.

Sieht aus wie es schwer ist, verzögertes Laden von Blob mit JPA zu tun. Ich versuchte @OneToOne Verein, aber es erschwert mehr als Hilfe. Ich zog das Bytes in einer anderen Klasse, ohne Verbindung mit MyClass (Mutter gleichen Tisch, gleiche 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  .....
}

Denken Sie daran, Eltern zu spülen, bevor das Blob zu speichern:

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

Jetzt kann ich die pdf laden allein:

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

Ich bin Anfänger nur mit JPA, die Hoffnung, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top