سؤال

هناك الكثير يمكن للكثير العثور عليه عن هذا googling قليلا ولكني لم أجد حلا جديدا لهذه المشكلة.

أساسا ما لدي هو عبء كبير على فئة معينة أريد تحميلها عند الطلب. طريقة ساذجة للقيام بذلك سيكون:

class MyType {

  // ...

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

هذا لا يعمل، على ما يبدو بسبب حقيقة أنني أستخدم برامج التشغيل Oracle، أي لا يتم التعامل مع كائنات LOB كمعامل بسيطة ولكن يتم تحميلها دائما. أو نحو ذلك لقد كنت أدى إلى الاعتقاد من الفوريز بلدي. هناك حل واحد يستخدم الأجهزة الخاصة لتحميل الخاصية كسول، ولكن كما يبدو أن مستندات السبات يقترح أنهم أقل من المهتمة بجعل هذا العمل بشكل صحيح، لذلك أنا أفضل أن أذهب إلى هذا الطريق. خاصة مع الاضطرار إلى تشغيل تمرير إضافي وجميع.

وبالتالي فإن الحل التالي الذي كنت قد تصوره ينفصل عن هذا الكائن بنوع آخر وتحديد جمعية. لسوء الحظ، في حين أن المستندات تعطي معلومات متضاربة، فمن الواضح أن التحميل كسول لا يعمل على جمعيات Onetoone مع المفتاح الأساسي المشترك. أقوم بتعيين جانب واحد من الارتباطات، لكنني لست متأكدا تماما من كيفية القيام بذلك عندما يكون هناك مفتاح أساسي مشترك.

لذلك يمكن لأي شخص أن يقترح أفضل طريقة للذهاب في هذا؟

هل كانت مفيدة؟

المحلول

وفق هذه فقط 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;
    }
}

نصائح أخرى

بدلا من القيام بالتحويل مع شرح العينات، قد يحاول المرء فقط تحويل الحقل من 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);  
} 

عملت بالنسبة لي (بدأ الحقل في تحميل كذاب، على Oracle).

نظرا لأنك يبدو أن تستخدم السبات وأتساءل عما إذا كانت مشكلتك مرتبطة بميزة السبات التالية:

باستخدام خصائص كسول جلب

يدعم Hibernate3 الجلب كسول من الخصائص الفردية. تعرف هذه تقنية التحسين أيضا باسم مجموعات جلب. يرجى ملاحظة أن هذه هي في الغالب ميزة تسويقية؛ تحسين الصف يقرأ هو أكثر أهمية بكثير من تحسين قراءة الأعمدة. ومع ذلك، فإن تحميل بعض خصائص الفصل فقط يمكن أن يكون مفيدا في الحالات القصوى. على سبيل المثال، عندما تحتوي الجداول القديمة على مئات الأعمدة ولا يمكن تحسين طراز البيانات.

lazy الخاصية تحميل يتطلب عملية بناء الأجهزة. وبعد إذا لم تكن فئاتك المستمرة غير محسنة، فسوف تتجاهل السبات إعدادات الخصائص الكسولة والعودة إلى جلب فوري.

يرى الأجهزة Bytecode لسبات باستخدام Maven.

المشاركة القديمة، ولكن واحد فقط ساعدني، بفضل إجابة @ tadeuszkopec.

يبدو أنه من الصعب إجراء تحميل كسول من Blob مع JPA. حاولت جمعية Onetoone، لكنها تعقد أكثر من المساعدة. لقد نقلت للتو البايت إلى فئة أخرى، مع عدم وجود جمعية مع myclass (الأصل. نفس الجدول، نفس المعرف):

@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]));

الآن يمكنني تحميل PDF وحده:

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

أنا مجرد مبتدئ مع JPA، نأمل أن يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top