我有一个带有 @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/