kno*_*noe 28 java postgresql hibernate jpa jdbc
我正在开发一个应用程序:
我想将PostgreSQL文本数据类型用于某些String属性.据我所知,在JPA中,这应该是正确的注释,在PostgreSQL中使用文本:
@Entity
public class Product{
...
@Lob
private String description;
....
}
Run Code Online (Sandbox Code Playgroud)
当我像这样注释我的实体时,我会遇到如下错误:http: //www.shredzone.de/cilla/page/299/string-lobs-on-postgresql-with-hibernate-36.html
简而言之:看起来hibernate和jdbc并不是clob/text-types的完美结合.
描述的解决方案正在运行:
@Entity
public class Product{
...
@Lob
@Type(type = "org.hibernate.type.TextType")
private String description;
...
}
Run Code Online (Sandbox Code Playgroud)
但这有一个明显的缺点:源代码在编译时需要休眠,这应该是不必要的(这是首先使用JPA的一个原因).
另一种方法是使用这样的列注释:
@Entity
public class Product{
...
@Column(columnDefinition = "text")
private String description;
...
}
Run Code Online (Sandbox Code Playgroud)
哪个工作得很好,但是:现在我遇到了具有文本类型的数据库(也称为文本;))如果将来会使用另一个数据库,注释很容易被忽略.因此,可能很难找到可能的错误,因为数据类型是在String中定义的,因此在运行时之前无法找到.
有没有解决方案,这很容易,我只是看不到它?我非常确定我不是唯一一个将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>
Run Code Online (Sandbox Code Playgroud)
更新:
这个问题或多或少等同于这个问题,选择的答案是在这个问题中描述的第二种方式,我不喜欢由于hibernate运行时依赖: 在Postgresql中存储任意长度的字符串
这似乎与以下内容有关:https://hibernate.atlassian.net/browse/JPA-48
由于该text
类型不是SQL标准的一部分,因此我猜没有正式的JPA方式.
但是,text
类型非常相似varchar
,但没有长度限制.您可以使用以下length
属性提示JPA实现@Column
:
@Column(length=10485760)
private String description;
Run Code Online (Sandbox Code Playgroud)
更新: 10 MiB似乎是varchar
postgresql 的最大长度.根据文件,这几乎text
是无限的:
在任何情况下,可存储的最长字符串大约为1 GB.
小智 5
我只需要添加这个注释:
@Column(columnDefinition="TEXT")
Run Code Online (Sandbox Code Playgroud)
它没有单独工作。我不得不在数据库中重新创建表。
DROP TABLE yourtable
或者只是将列类型更改为text
withALTER TABLE
语句
我会选择简单的private String description;
。仅当您从代码生成数据库时,列类型才会成为问题,因为它将生成为而varchar
不是text
.
以与数据库无关的方式进行编码非常好,并且不需要任何 JPA 供应商特定的东西,但在某些情况下这是不可能的。如果现实情况是您必须支持多种数据库类型及其所有细节,那么您必须在某个地方考虑这些细节。一种选择是用于columnDefinition
定义列类型。另一种方法是保留代码不变,仅更改数据库中的列类型。我更喜欢第二个。
归档时间: |
|
查看次数: |
38717 次 |
最近记录: |