为PostgreSQL的文本类型更正JPA注释,无需Hibernate Annotations

2022-09-01 04:42:29

我正在开发一个应用程序:使用:

  • Java 1.7
  • JPA(包含在 javaee-api 7.0 中)
  • 休眠 4.3.8.最终版
  • PostgreSQL-JDBC 9.4-1200-jdbc41
  • PostgreSQL 9.3.6

我想对某些字符串属性使用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

简而言之:对于 clob/text 类型,休眠和 jdbc 似乎并不齐头并进。

所描述的解决方案正在工作:

@Entity
public class Product{
    ...
    @Lob
    @Type(type = "org.hibernate.type.TextType")
    private String description;
    ...
}

但这有一个明显的缺点:源代码需要在编译时休眠,这应该是不必要的(这是首先使用JPA的一个原因)。

另一种方法是像这样使用列批注:

@Entity
public class Product{
    ...
    @Column(columnDefinition = "text")
    private String description;
    ...
}

这很好用,但是:现在我被困在具有文本类型(也称为文本;))的数据库上,如果将来使用另一个数据库,注释很容易被忽略。因此,可能的错误可能很难找到,因为数据类型是在 String 中定义的,因此在运行时之前找不到。

有没有一个解决方案,这很容易,我只是没有看到它?我很确定我不是唯一一个将JPA与Hibernate和PostgreSQL结合使用的人。所以我有点困惑,我找不到更多这样的问题。

只是为了完成这个问题,持久性.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>

更新:


答案 1

由于该类型不是SQL标准的一部分,因此我猜没有官方的JPA方式。text

但是,该类型与 非常相似,但没有长度限制。您可以使用以下属性提示 JPA 实现:textvarcharlength@Column

@Column(length=10485760)
private String description;

更新:10 MiB似乎是postgresql中的最大长度。根据文档,几乎是无限的:varchartext

在任何情况下,可以存储的最长可能字符串约为 1 GB。


答案 2

我只需要添加这个注释:

@Column(columnDefinition="TEXT")

它本身并不奏效。我不得不在数据库中重新创建表。

DROP TABLE yourtable或者只是将列类型更改为 with 语句textALTER TABLE


推荐