我正在开发一个应用程序,使用:
我想对一些字符串属性使用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
我会使用简单的私有字符串描述 。只有在从代码生成数据库时,列类型才是一个问题,因为它将被生成为varchar,而不是text。
以与数据库无关的方式编码很好,并且没有任何JPA供应商特定的东西,但在某些情况下这是不可能的。如果现实是您必须支持多种数据库类型及其所有细节,那么您必须在某个地方考虑这些细节。一种选择是使用列定义
来定义列类型。另一种是保持代码不变,只需更改数据库中的列类型。我更喜欢第二个。
我只需添加以下注释:
@Column(columnDefinition="TEXT")
它不能单独工作。我必须在数据库中重新创建表。
用alter TABLE语句将表格拖放到表格中,或将列类型更改为文本
因为文本类型不是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