gpt4 book ai didi

java - JBoss6 JPA : Entity with @Lob results in GenericJDBCException

转载 作者:可可西里 更新时间:2023-11-01 06:46:15 26 4
gpt4 key购买 nike

我有一个带有 @Lob 注释的简单 EntityBean。如果我删除这个注解,我在 JBossAS 6.0.0.Final 和 MySQL5 上不会出错。但是如果我用 @Lob 注释它(因为在我的例子中 mt 包含大约 100 到 5000 个字符),如果我坚持实体,我的测试环境会出错。

  • 没有@Lob:mt被映射到VARCHAR
  • 使用 @Lob:mt 映射到 LONGTEXT(这是我想要的,但我得到错误)

这是我的实体:

@Entity
@Table(name = "Description")
public class Description implements Serializable
{
public static final long serialVersionUID=1;

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;

@Lob
private String mt;
} // ... getter/setter

错误在这里:

...
Caused by: org.hibernate.exception.GenericJDBCException: could not insert
[my.Description]
...
Caused by: java.sql.SQLException: Connection is not associated with a managed
connection.org.jboss.resource.adapter.jdbc.jdk6.WrappedConnectionJDK6@3e4dd
...

我真的不知道为什么会出现这个(可重现的)错误。环境似乎没问题,通过了许多其他测试,甚至在没有 @Lob 注解的情况下也能正常工作。

这个问题与JPA: how do I persist a String into a database field, type MYSQL Text有关,其中对 JPA/MySQL 使用 @Lob 是公认的答案。

更新 1 以上错误是特定于操作系统的。在 W7 机器上,@Lob 没有问题,OSX Lion 总是错误。我会尝试更新 MySQL 和驱动程序。

更新 2 Kimi 使用 @Column(columnDefinition = "longtext") 提出的变通方法工作正常,即使在 OSX 上也是如此。在这两种情况下,MySQL 创建相同的列:LONGTEXT。

更新 3 我将 MySQL 更新为 mysql-5.5.17-osx10.6-x86_64 并将连接器更新为 mysql-connector-java-5.1.18 。还是一样的错误。

最佳答案

没有需要使用@Lob 注释String 属性。只需使用 @Column(length = 10000) 设置列长度。

编辑:

此外,您始终可以将长度设置为您的数据库特定的最大值,以及使用 columndefinition 设置定义列类型以适合您的需要。

例如,如果您使用的是 MySQL 5.0.3 或更高版本,则每种数据类型可以存储的最大数据量如下:

  • VARCHAR:65,535 字节(~64Kb,21,844 个 UTF-8 编码字符)
  • 文本:65,535 字节(~64Kb,21,844 个 UTF-8 编码字符)
  • MEDIUMTEXT:16,777,215 字节(约 16Mb,约 550 万个 UTF-8 编码字符)
  • LONGTEXT:4,294,967,295 字节(约 4GB,约 14 亿个 UTF-8 编码字符)。

据我了解,@Lob 只是根据底层数据库设置列类型和长度。

关于java - JBoss6 JPA : Entity with @Lob results in GenericJDBCException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com