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

标签 java mysql jpa jboss6.x lob

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

相关文章:

php - 在 mysqli 连接中使用 mysql_* 函数

java - 通过 joinColumn 查询 EntityManager

java - Intellij 没有显示任何语法错误/没有给出任何建议

Java 将 {String,String}[] 转换为 Map<String,String[]>

java - 在 TestNG 中使用 Method Interceptor 是否会在失败时跳过测试或即使有任何失败也执行它?

JPA 关系映射概念

java - HTTP 状态 500 - 无法提取结果集 - hibernate

java - 使用 JUnit 和 EasyMock Java 测试 Servlet

php - 避免用户在不同的浏览器或系统中登录

php - Laravel 用于生产和开发的不同 config/database.php