如何在Hibernate和Postgresql中映射LOB以清理未使用的空间

如何在Hibernate和Postgresql中映射LOB以清理未使用的空间,hibernate,postgresql,lob,Hibernate,Postgresql,Lob,如果您有lob类型 @Column(name = "xml") @Lob private String xml; 然后在PostgreSQL中,您将得到类型为text的列 \d tablename Column | Type | Modifiers ----------------+-----------------------------+----------- xml | text

如果您有lob类型

@Column(name = "xml")
@Lob
private String xml;
然后在PostgreSQL中,您将得到类型为text的列

 \d tablename
 Column     |            Type             | Modifiers 
 ----------------+-----------------------------+-----------
 xml            | text                        | 
在该列中插入一些文本时,将创建一个大对象,该列包含指向该对象的链接

# select * from  tablename
xml
+------------
 242781
(1 row)
在本文中,建议使用vacuumlo实用程序来清理与已删除行相对应的大型对象。但是根据这个

然后它扫描数据库中oid类型的所有列 或lo,并从临时表中删除匹配项。(注: 仅考虑具有这些名称的类型;尤其是域 不考虑超过它们。)

所以,若您在包含文本列的数据库上运行vacuumlo,那个么所有大型对象都将被删除,因为它们是从文本列而非oid引用的。 所以,问题是我应该如何在hibernate中映射LOB对象,以允许清理未使用的空间


我用PostgreSQL 93.4和Hibernate 4.3.5

检查,当您使用<代码> @ Lob < /Cord>注释时,使用“大对象”,如果我没有错的话(我认为这是一个bug,它应该使用<代码> BTEA < /COD>)。无论如何,在大多数情况下,使用“大型对象”是错误的选择。如果要在该列中存储XML,为什么不使用
XML
类型?或者至少让Hibernate使用
bytea
而不是
oid
这里有一个解决方法,可以存储值,而不是在postgres中使用大型对象。