2012-01-28 14 views
8

tôi đã tìm thấy giải pháp rất tốt đẹp của lấy hình ảnh từ db/blob nhờ How to retrieve and display images from a database in a JSP page?Lấy hình ảnh từ blob qua Hibernate (không JDBC)

Nhưng đây là giải pháp mà sử dụng JDBC kết nối trên mọi yêu cầu hình ảnh .

Tôi đang sử dụng Mùa xuân 3 chú thích và Hibernate 3.

tôi đã cố gắng để làm điều tương tự bằng cách 'imageService' của tôi, mà là autowired bởi chú thích trong ImageServlet lớp, nhưng tôi đã nhận NullPointerException, có nghĩa là có thể imageService không được thiết lập bởi Dependency Injection.

Có cách nào để giải quyết vấn đề đó không? Tôi không muốn thực hiện kết nối jdbc đơn trên yêu cầu hình ảnh.

+0

Bạn có thể hiển thị một số mã (lớp ImageService và ImageServlet) không? bạn có thể quên thêm chú thích '@ Component' hoặc' @ Service' vào lớp imageService của mình. –

+0

hibernate dựa trên 100% trên JDBC –

Trả lời

6

Tôi hy vọng bạn lưu trữ hình ảnh trong bảng dưới dạng loại BLOB (Nếu không cố gắng làm như vậy, vì đây là phương pháp hay nhất). Giả sử bạn có một lớp học Person với số image của người được lưu trữ trong DB. Nếu bạn muốn lập bản đồ này, chỉ cần thêm một thuộc tính trong POJO người của bạn giữ hình ảnh đó.

@Column(name="image") 
@Blob 
private Blob image; 

Khi bạn hiển thị, hãy chuyển đổi thành byte[] và hiển thị.

private byte[] toByteArray(Blob fromImageBlob) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     return toByteArrayImpl(fromImageBlob, baos); 
    } catch (Exception e) { 
    } 
    return null; 
    } 



private byte[] toByteArrayImpl(Blob fromImageBlob, 
     ByteArrayOutputStream baos) throws SQLException, IOException { 
    byte buf[] = new byte[4000]; 
    int dataSize; 
    InputStream is = fromImageBlob.getBinaryStream(); 

    try { 
     while((dataSize = is.read(buf)) != -1) { 
     baos.write(buf, 0, dataSize); 
     }  
    } finally { 
     if(is != null) { 
     is.close(); 
     } 
    } 
    return baos.toByteArray(); 
    } 

Bạn có thể xem các ví dụ bên dưới để biết thêm về nó.

  1. http://i-proving.com/2006/08/23/blobs-and-hibernate
  2. http://snehaprashant.blogspot.com/2008/08/how-to-store-and-retrieve-blob-object.html
  3. http://viralpatel.net/blogs/2011/01/tutorial-save-get-blob-object-spring-3-mvc-hibernate.html

Như bạn có thể thấy có rất nhiều cách để làm điều này. Chọn cái thích hợp cho bạn.

+0

Tôi vẫn còn bối rối bất chấp lời giải thích tuyệt vời này. Blob là một giao diện, vậy bạn sử dụng nó như một kiểu dữ liệu như thế nào? Tôi đang sử dụng JPA hibernate và không thể tìm ra cách lập bản đồ này đúng cách. Xem bài đăng tại đây http://stackoverflow.com/questions/10141373/read-and-write-blobs-by-mapping-them-to-binary-data –

+0

@George: Là người dùng API, chúng tôi không nên lo lắng nếu BLOB là một giao diện hoặc lớp học. Hibernate sẽ có một số [class] (http://stackoverflow.com/a/9312802/507864) triển khai kiểu BLOB và chúng sẽ sử dụng nó để điền dữ liệu. Nếu bạn làm theo các ví dụ đúng cách, bạn sẽ có thể ánh xạ một loại BLOB đúng cách. Trong khi đó, u có thể upvote câu trả lời nếu nó là hữu ích. – ManuPK

+0

Tôi nhầm lẫn, bạn đang sử dụng chú thích @Blob không phải là chú thích ngủ đông hợp lệ. Nó kết quả với một lỗi biên dịch. Khi sử dụng java.sql.Blob như một kiểu dữ liệu tôi nhận được một lỗi biên dịch khác với netbeans. các thuộc tính cơ bản chỉ có thể có các kiểu sau: ..... Tôi cũng sử dụng các thực thể và không phải các tệp lập bản đồ ngủ đông, vì vậy tôi không chắc chắn cách ánh xạ kiểu dữ liệu thuộc tính của tôi cho kiểu dữ liệu blob. Một số liên kết liên kết ngược với ngủ đông cũng bị hỏng. –