注释byte []属性的可移植方式是什么?
这取决于您想要什么。JPA可以保留未注释的内容
byte[]。根据JPA 2.0规范:
11.1.6基本注释
的
Basic注释是映射到数据库列的最简单的类型。所述Basic注释可以应用于以下任何类型的持久性或实例变量: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[],枚举,以及任何其他类型的器具Serializable。如2.8节所述,Basic对于这些类型的持久字段和属性,注释的使用是可选的。如果未为此类字段或属性指定基本注释,则将应用基本注释的默认值。
并且Hibernate会默认将它映射到PostgreSQL使用PostgreSQL处理的SQL
VARBINARY(或SQL是否
LONGVARBINARY取决于
Column大小?)
bytea。
但是,如果您希望将
byte[]其存储在大对象中,则应使用
@Lob。从规格:
11.1.24吊球注释
甲
Lob注释指定持久性属性或字段应保持为一个大型对象到数据库支持的大对象类型。可移植应用程序Lob在映射到数据库Lob类型时应使用
注释。所述Lob注释可以与基本注释或与一起使用ElementCollection的注释当元素集合值是基本类型。ALob可以是二进制或字符类型。Lob从持久字段或属性的类型推断出类型,并且,除了字符串和字符类型外,默认为Blob。
然后Hibernate会将其映射到
BLOBPostgreSQL使用PostgreSQL处理的SQL
oid。
在某些最新的hibernate版本中已解决此问题吗?
好吧,问题是我不知道到底是什么问题。但是我至少可以说,自3.5.x分支中的3.5.0-Beta-2(已引入更改)以来,没有任何更改。
但是,我对HHH-4876,HHH-4617以及PostgreSQL和BLOB(在的javadoc中提到
PostgreSQLDialect)等问题的理解是,您应该设置以下属性
hibernate.jdbc.use_streams_for_binary=false
如果您想使用
oidie
byte[]与
@Lob(这是我的理解,因为
VARBINARY这不是您想要的Oracle)。你有尝试过吗?
作为替代方案,HHH-4876建议使用不推荐使用的方法
PrimitiveByteArrayBlobType来获得旧的行为(Hibernate
3.5之前的版本)。
参考文献
- JPA 2.0规范
- 第2.8节“映射非关系字段或属性的默认值”
- 第11.1.6节“基本注释”
- 第11.1.24节“ Lob注释”
资源资源
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4876
- http://opensource.atlassian.com/projects/hibernate/browse/HHH-4617
- http://relation.to/Bloggers/PostgreSQLAndBLOBs


![为byte []设置适当的休眠注释 为byte []设置适当的休眠注释](http://www.mshxw.com/aiimages/31/435886.png)
