For String propertIEs that may contain more than 255 characters,it is advised to add a @Lob annotation to the appropriate property. For example,to keep a comment text in an entity,one would write:
@Lobpublic String getComment() { return comment; }public voID setComment(String comment) { this.comment = comment; }
On Postgresql,a large string is usually kept in a TEXT column (instead of VARCHAR). However,after updating to Hibernate 3.6,an exception was suddenly thrown when accessing such a property (along with an sqlState: 22003 from Postgresql):
org.postgresql.util.PsqlException: Bad value for type long : This is some text... at org.postgresql.jdbc2.AbstractJdbc2ResultSet.tolong(AbstractJdbc2ResultSet.java:2796) at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getLong(AbstractJdbc2ResultSet.java:2019) at org.postgresql.jdbc4.Jdbc4ResultSet.getClob(Jdbc4ResultSet.java:43) at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getClob(AbstractJdbc2ResultSet.java:384) ... and more
ObvIoUsly,the Postgresql connector trIEd to interprete the textual content as a long integer Now,which – of course – results in a failure. Postgresql kNows two ways of storing binary large objects,either as BYTEA within the table space,or as OID in a separate place and referenced by a numerical IDentifIEr. It seems that Hibernate 3.6 suddenly treats TEXT columns like OID columns as well.
In the internet,I have found similar problems related to @Lob annotated byte[] propertIEs. A common solution was to add a @Type annotation to the property.
An attempt to add @Type(type = “org.hibernate.type.MaterializedClobType”) dID not help at all. Instead,@Type(type = “org.hibernate.type.TextType”) dID the trick:
@Lob@Type(type = "org.hibernate.type.TextType")public String getComment() { return comment; }public voID setComment(String comment) { this.comment = comment; }Update: An alternative proposed by valSaraj in the comments is to use @Column(columnDeFinition = “text”),which requires not to use @Lob at Strings at all:@Column(columnDeFinition = "text")public String getComment() { return comment; }public voID setComment(String comment) { this.comment = comment; }
I think this is the better solution,however it requires the underlying database to support the text column type. For Postgresql,it Now works fine again,even without needing to alter the table column type. However I Couldn’t check the impact of the annotation on other DBMS (like Oracle). Your Feedback is welcome.
总结以上是内存溢出为你收集整理的String LOBs on PostgreSQL with Hibernate 3.6全部内容,希望文章能够帮你解决String LOBs on PostgreSQL with Hibernate 3.6所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)