استرجاع blob من قاعدة بيانات MySQL في تطبيق Hibernate / JSF

StackOverflow https://stackoverflow.com/questions/4013783

  •  26-09-2019
  •  | 
  •  

سؤال

أواجه بعض المشاكل في استرداد بيانات النقطة بشكل صحيح من قاعدة البيانات الخاصة بي باستخدام Java في تطبيق JSF 2.0 الخاص بي. المشكلة الأولى التي أواجهها هي على طريقة getter الخاصة بي لـ blob المسماة "ملف" ، أحصل على خطأ يقول أن "السمات الأساسية لا يمكن أن تكون إلا من الأنواع التالية ..." قائلاً بشكل أساسي أنه لا يمكنني إعادة كائن blob. الرمز الخاص بي يشبه ما هو أدناه. حتى مع الخطأ يتجمع الكود الخاص بي. لقد قمت بإنشاء طريقة اختبار (آخر جزء من التعليمات البرمجية أدناه) وحاولت الاختبار ولكنه يعطيني أخطاء وقت التشغيل.

تحكم الفول

import java.sql.Blob;

@Entity
@Table(named = "files")
@NamedQueries( {
    @NamedQuery(name = "MyBlob.getBlob",
    query = from MyBlob WHERE fileId =: fileId")
})
public class MyBlob implements Serializable {

     private Integer fileId;
     private Blob file;
     ...

     public Integer getFileId() {
         return fileId;
     }

     public void setFileId() {
         this.fileId = fileId;
     }

     public Blob getFile() {
         return file;
     }

     public void setFile(Blob file) {
         this.file = file;
     }

     ....

}

طريقة ملف Blobdao.java للحصول على Blob

public MyBlob getBlob(Integer fileId) throws HibernateException {
    Session session = getSessionFactory().openSession();
    try { 
      MyBlob blob = (MyBlob)session.getNamedQuery("MyBlob.getBlob").setInteger("fileId", fileId).uniqueResult();
      return blob;
    } catch(HibernateException e) {
         throw new HibernateException(e);
    } finally {
        session.close();
    }
}

testdao.java

@Test
public void testBlob() {

    MyBlob test = blobdao.getBlob(1);  // 1 is a fileId that exists in the DB with a blob image file.
    Blob blob = test.getFile();
    try {
        System.out.println(blob.length));   //this prints a number but I dont think the right one. 
        if(blob.length > 0 ) {
             System.out.println(blob.toString() ); //errors out here
        }
    } catch(SQLException e) {
          return System.out.println("Failed");
    }
}

لست متأكدًا من أنني أفعل هذا بشكل صحيح على الإطلاق. أي مساعدة ستكون رائعة. شكرًا.

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

المحلول

على طريقة getter الخاصة بي لـ blob المسماة "ملف" ، أحصل على خطأ يقول أن "السمات الأساسية لا يمكن أن تكون إلا من الأنواع التالية ..." قائلاً بشكل أساسي أنه لا يمكنني إعادة كائن blob.

في الواقع ، أ java.sql.Blob ليس حقلًا أو خاصية ثابتة يمكن تعيينها بواسطة Hibernate/JPA. مواصفات JPA تضع مثل هذا:

2.1.1 الحقول والخصائص المستمرة

...

قد تكون الحقول أو خصائص الكيان المستمرة من الأنواع التالية: أنواع Java البدائية ؛ java.lang.String; ؛ أنواع أخرى قابلة للتسلسل (بما في ذلك أغلفة الأنواع البدائية ، java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp، الأنواع المسلسل المعرفة من قبل المستخدم ، byte[], Byte[], char[], ، و Character[]) ؛ التعدادات أنواع الكيانات و/أو مجموعات أنواع الكيانات ؛ والفئات القابلة للتضمين (انظر القسم 2.1.5).

ربما يجب عليك استخدام Lob التعليق التوضيحي وتغيير نوع السمة الخاص بك. من المواصفات:

9.1.19 التعليق التوضيحي لوب

يحدد شرح LOB أنه ينبغي استمرار خاصية أو حقل ثابت ككائن كبير لنوع كائن كبير مدعوم من قاعدة البيانات. يجب أن تستخدم التطبيقات المحمولة شرح التوضيح عند التعيين إلى نوع قاعدة البيانات. ال Lobيمكن استخدام التعليق التوضيحي بالاقتران مع Basic حاشية. ملاحظة. أ Lobقد يكون إما نوع ثنائي أو حرف. ال Lob يتم استنتاج النوع من نوع الحقل أو الخاصية الثابتة ، باستثناء الإعدادات الافتراضية للسلسلة والأحرف إلى blob.

...

مثال 1:

@Lob @Basic(fetch=EAGER)
@Column(name="REPORT")
protected String report;

مثال 2:

@Lob @Basic(fetch=LAZY)
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
protected byte[] pic;

مراجع

  • مواصفات JPA 1.0
    • القسم 2.1.1 "الحقول والخصائص المستمرة"
    • القسم 9.1.19 "شرح لوب"

حسنًا ، تتمثل متطلباتي الدقيقة في استرداد النقطة من قاعدة البيانات إما كقطعة أو بايت [] ، مهما كان يعمل ، ثم تحويل ذلك بطريقة أو بأخرى إلى كائن inputstream صالح.

ماذا عن ByteArrayInputStream(byte[])?

نصائح أخرى

أنا أظن Blob الكائن هو الكيان الخاص بك. قد يساعد ذلك إذا قمت بطباعة ذلك أيضًا.

تأكد الخاص بك Blob عائدات byte[]

@Basic(fetch = FetchType.LAZY)
@Lob             
@Column(length = 104857600, nullable = false)
private byte[] data;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top