Tôi có một ứng dụng sử dụng chú thích hibernate 3.1 và JPA. Nó có một vài đối tượng có thuộc tính byte [] (kích thước 1k - 200k). Nó sử dụng chú thích JPA @Lob và hibernate 3.1 có thể đọc những điều này tốt trên tất cả các cơ sở dữ liệu chính - nó dường như che giấu các đặc thù của nhà cung cấp JDBC Blob (như nó nên làm).
@Entity
public class ConfigAttribute {
@Lob
public byte[] getValueBuffer() {
return m_valueBuffer;
}
}
Chúng tôi đã phải nâng cấp lên 3,5, khi chúng tôi phát hiện ra rằng nghỉ ngủ 3,5 (và sẽ không sửa) kết hợp chú thích này trong postgresql (không có cách giải quyết). Tôi đã không tìm thấy một sửa chữa rõ ràng cho đến nay, nhưng tôi đã nhận thấy rằng nếu tôi chỉ gỡ bỏ @Lob, nó sử dụng loại bytea postgresql (hoạt động, nhưng chỉ trên postgres).
annotation postgres oracle works on
-------------------------------------------------------------
byte[] + @Lob oid blob oracle
byte[] bytea raw(255) postgresql
byte[] + @Type(PBA) oid blob oracle
byte[] + @Type(BT) bytea blob postgresql
once you use @Type, @Lob seems to not be relevant
note: oracle seems to have deprecated the "raw" type since 8i.
Tôi đang tìm cách để có một lớp chú thích duy nhất (với thuộc tính blob) có thể di động trên các cơ sở dữ liệu chính.
- Cách di động để chú thích một thuộc tính byte [] là gì?
- Điều này có cố định trong một số phiên bản gần đây của ngủ đông không?
Cập nhật: Sau khi đọc blog này, cuối cùng tôi cũng đã tìm ra cách giải quyết ban đầu trong vấn đề JIRA là: Rõ ràng bạn phải bỏ @Lob và chú thích tài sản là:
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
byte[] getValueBuffer() {...
Tuy nhiên, điều này không hiệu quả với tôi - tôi vẫn nhận được OID thay vì bytea; tuy nhiên nó đã làm việc cho tác giả của vấn đề JIRA, người dường như muốn oid.
Sau câu trả lời từ A. Garcia, sau đó tôi đã thử kết hợp này, thực sự hoạt động trên postgresql, nhưng không phải trên orory.
@Type(type="org.hibernate.type.BinaryType")
byte[] getValueBuffer() {...
Điều tôi thực sự cần làm là kiểm soát @ org.hibernate.annotations. Gõ sự kết hợp (@Lob + byte [] được ánh xạ) thành (trên postgresql).
Đây là đoạn trích từ 3.5.5.Final từ MaterializedBlobType (kiểu sql Blob). Theo blog của Steve, postgresql muốn bạn sử dụng Streams cho bytea (đừng hỏi tôi tại sao) và loại Blob tùy chỉnh của postgresql cho các oids. Cũng lưu ý rằng việc sử dụng setBytes () trên JDBC cũng dành cho bytea (từ kinh nghiệm trong quá khứ). Vì vậy, điều này giải thích tại sao các luồng sử dụng không ảnh hưởng đến cả hai đều giả định 'bytea'.
public void set(PreparedStatement st, Object value, int index) {
byte[] internalValue = toInternalFormat( value );
if ( Environment.useStreamsForBinary() ) {
// use streams = true
st.setBinaryStream( index,
new ByteArrayInputStream( internalValue ), internalValue.length );
}
else {
// use streams = false
st.setBytes( index, internalValue );
}
}
Kết quả này trong:
ERROR: column "signature" is of type oid but expression is of type bytea
Cập nhật Câu hỏi logic tiếp theo là: "tại sao không thay đổi định nghĩa bảng theo cách thủ công thành bytea" và giữ (@Lob + byte [])? Điều này không hoạt động, UNTIL bạn cố gắng lưu trữ một byte null []. Trình điều khiển postgreQuery nghĩ là biểu thức kiểu OID và kiểu cột là bytea - điều này là do hibernate (phải) gọi JDBC.setNull () thay vì JDBC.setBytes (null) mà trình điều khiển PG mong đợi.
ERROR: column "signature" is of type bytea but expression is of type oid
Hệ thống loại trong chế độ ngủ đông hiện đang là một 'công việc đang tiến hành' (theo nhận xét khấu hao 3.5.5). Trong thực tế, rất nhiều mã 3.5.5 không được dùng nữa, thật khó để biết phải xem gì khi phân lớp PostgreQueryDialect).
AFAKT, Các loại.BLOB / 'oid' trên postgresql nên được ánh xạ tới một số loại tùy chỉnh sử dụng truy cập JDBC kiểu OID (ví dụ: đối tượng PostgresqlBlobType và KHÔNG MaterializedBlobType). Tôi chưa bao giờ thực sự sử dụng thành công Blobs với postgresql, nhưng tôi biết rằng bytea chỉ đơn giản là hoạt động như một / tôi mong đợi.
Tôi hiện đang xem BatchUpdateException - có thể trình điều khiển không hỗ trợ theo đợt.
Câu nói hay từ năm 2004: "Để tổng hợp những lời huyên thuyên của tôi, tôi muốn nói rằng chúng ta nên chờ trình điều khiển JDBC thực hiện LOB đúng cách trước khi thay đổi Hibernate."
Người giới thiệu:
- https://forum.hibernate.org/viewtopic.php?p=2393203
- https://forum.hibernate.org/viewtopic.php?p=2435174
- http://hibernate.atlassian.net/browse/HHH-4617
- http://postgresql.1045698.n5.nabble.com/Migration-to-Hibernate-3-5-final-td2175339.html
- https://jira.springframework.org/browse/SPR-2318
- https://forums.hibernate.org/viewtopic.php?p=2203382&sid=b526a17d9cf60a80f13d40cf8082aafd
- http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/