JBoss6 JPA:带有@Lob的实体导致GenericJDBCException

Tho*_*hor 6 java mysql jpa lob jboss6.x

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

  • without @Lob:mt映射到VARCHAR
  • with @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
Run Code Online (Sandbox Code Playgroud)

错误在这里:

...
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
...
Run Code Online (Sandbox Code Playgroud)

我真的不知道为什么我会得到这个(可重现的)错误.环境似乎没问题,许多其他测试都通过了,它甚至可以在没有@Lob注释的情况下工作.

这个问题与JPA有关:如何将String保存到数据库字段中,键入MYSQL Text,其中@LobJPA/MySQL的使用是接受的答案.

更新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.还是一样的错误.

Kim*_*imi 5

有没有必要标注一个String属性@Lob。只需使用@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只需根据基础数据库设置列类型和长度。

  • 好吧,您始终可以将长度设置为数据库特定的最大值,并使用“columndefinition”设置定义列类型以满足您的需要。例如,如果您使用的是 MySQL 5.0.3 或更高版本,UTF-8 编码的 VARCHAR 的最大长度为 21,844 个字符(65,535 字节),这与 TEXT 类型的限制相同。MEDIUMTEXT 可以容纳 16,777,215 个字节(~16Mb,~550 万个字符)和 LONGTEXT 4,294,967,295 个字节(~4GB,~14 亿个字符)。据我了解,`@Lob` 只是将列类型和长度设置为某些特定于数据库的值。 (2认同)