我正在开发一个应用程序,使用:
我想对一些字符串属性使用PostgreSQL文本数据类型。据我所知,在JPA中,要使用PostgreSQL中的文本,这应该是正确的注释:
@Entity
public class Product{
...
@Lob
private String description;
....
}
当我像这样注释我的实体时,我遇到的错误如下所示:http://www.shredzone.de/cilla/page/299/string-lobs-on-postgresql-with-hibernate-36.html
简而言之:hibernate和jdbc对于clob/文本类型似乎并没有协同工作。
所述解决方案正在运行:
@Entity
public class Product{
...
@Lob
@Type(type = "org.hibernate.type.TextType")
private String description;
...
}
但这有一个明显的缺点:源代码需要在编译时Hibernate,这应该是不必要的(这是首先使用JPA的原因之一)。
另一种方法是使用如下列注释:
@Entity
public class Product{
...
@Column(columnDefinition = "text")
private String description;
...
}
这工作得很好,但是:现在我被具有文本类型(也称为text;)的数据库卡住了,如果将来将使用另一个数据库,注释很容易被忽略。因此可能的错误可能很难找到,因为数据类型是在字符串中定义的,因此在运行时之前无法找到。
有没有这么简单的解决方案,我就是看不出来?我非常肯定,我不是唯一一个将JPA与Hibernate和PostgreSQL结合使用的人。所以我有点困惑,我找不到更多这样的问题了。
为了完成这个问题,persistence.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="entityManager">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.app.model.Product</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:postgresql://localhost:5432/awesomedb" />
<property name="javax.persistence.jdbc.user" value="usr" />
<property name="javax.persistence.jdbc.password" value="pwd" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.jdbc.use_streams_for_binary" value="false" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
更新:
>
这个问题或多或少与这个问题等价,选择的答案是这个问题中描述的第二种方法,由于Hibernate运行时依赖关系,我不喜欢这种方法:在Postgresql中存储任意长度的字符串
这似乎有点关系:https://hibernate.atlassian.net/browse/JPA-48
因为文本类型不是SQL标准的一部分,所以我想没有正式的JPA方式。
但是,文本类型与varchar非常相似,但没有长度限制。您可以使用列的属性提示JPA实现:
@Column(length=10485760)
private String description;
更新:10 MiB似乎是postgresql中varchar的最大长度。文档显示,文本几乎没有限制:
在任何情况下,可以存储的最长可能字符串约为1 GB。
我只需添加以下注释:
@Column(columnDefinition="TEXT")
它不能单独工作。我必须在数据库中重新创建表。
用alter TABLE语句将表格拖放到表格中,或将列类型更改为文本
我会使用简单的私有字符串描述代码>。只有在从代码生成数据库时,列类型才是一个问题,因为它将被生成为varchar,而不是text。
以与数据库无关的方式编码很好,并且没有任何JPA供应商特定的东西,但在某些情况下这是不可能的。如果现实是您必须支持多种数据库类型及其所有细节,那么您必须在某个地方考虑这些细节。一种选择是使用列定义
来定义列类型。另一种是保持代码不变,只需更改数据库中的列类型。我更喜欢第二个。