提问者:小点点

没有Hibernate注释的PostgreSQL文本类型的正确JPA注释


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

  • Java 1.7

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


  • 共3个答案

    匿名用户

    因为文本类型不是SQL标准的一部分,所以我想没有正式的JPA方式。

    但是,文本类型与varchar非常相似,但没有长度限制。您可以使用列的属性提示JPA实现:

    @Column(length=10485760)
    private String description;
    

    更新:10 MiB似乎是postgresql中varchar的最大长度。文档显示,文本几乎没有限制:

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

    匿名用户

    我只需添加以下注释:

    @Column(columnDefinition="TEXT")
    

    它不能单独工作。我必须在数据库中重新创建表。

    用alter TABLE语句将表格拖放到表格中,或将列类型更改为文本

    匿名用户

    我会使用简单的私有字符串描述。只有在从代码生成数据库时,列类型才是一个问题,因为它将被生成为varchar,而不是text。

    以与数据库无关的方式编码很好,并且没有任何JPA供应商特定的东西,但在某些情况下这是不可能的。如果现实是您必须支持多种数据库类型及其所有细节,那么您必须在某个地方考虑这些细节。一种选择是使用列定义来定义列类型。另一种是保持代码不变,只需更改数据库中的列类型。我更喜欢第二个。