当前位置: 首页 > 知识库问答 >
问题:

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

楚俊逸
2023-03-14

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

  • 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个答案

    程凯定
    2023-03-14

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

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

    丰博
    2023-03-14

    我只需添加以下注释:

    @Column(columnDefinition="TEXT")
    

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

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

    龙嘉誉
    2023-03-14

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

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

    @Column(length=10485760)
    private String description;
    

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

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

     类似资料:
    • 问题内容: 如果我们使用 代替 如果我们使用不带注释的日期列属性,会有任何副作用吗? 问题答案: 我设法找到的只有一部分文档: 在纯Java API中, 未定义时间 的 时间精度 。处理时态数据时,您可能需要描述数据库中的预期精度。时间数据可以具有DATE,TIME或TIMESTAMP精度(即实际日期,仅时间或两者兼有)。使用@Temporal批注进行微调。 从2.2.2.1开始。声明基本属性映射

    • 我是spring界的新手,我正在研究如何将Hibernate和spring框架集成在一起 我对Hibernate注释和JPA注释之间的关系做了一些研究。 我有类似以下实体类的东西: 我不理解的是Hibernate注释和JPA注释之间的关系是什么 前面示例中使用的注释@Entity、@Table(Name=“Person”)、@GeneratedValue(Strategy=GenerationTy

    • 我想它不干净...有没有人知道如何在不使用SQL符号的情况下使它变得简单?

    • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?

    • 关于注释和注释,我遇到了一个有趣的问题在Spring Boot项目上,spring data jpa也在项目中。 基本上,我有软删除机制,这是为实体设置一个有效的日期(例如属性列在实体类中带有属性)。这些实体用注释类似于。这样,将设置为now和before的软删除的实体自动删除。(例如实体类) 我还有一些其他实体没有(例如实体类) 以及其他一些可用的表。如果是Jpa查询带注释的方法。我正面临着一些

    • 我想在Spring Boot Controller方法中返回一条没有@ResponseBody注释的纯文本消息。 通常,当我返回一个字符串时,会出现一个错误。(实际上,它会查找html文件。) 当我使用此代码时,这将返回一个错误 错误解决模板[这是一个纯文本],模板可能不存在或可能无法访问任何配置的模板解析程序org.thymeleaf.exceptions.TemplateInputExc001