7

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

  • 没有@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

错误在这里:

...
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 有关:如何将 String 持久化到数据库字段中,键入 MYSQL Text,其中使用@Lobfor JPA/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. 还是同样的错误。

4

2 回答 2

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只需根据底层数据库设置列类型和长度。

于 2011-10-25T19:43:03.533 回答
2

对我有用的另一种方法是更新jBoss 的启动配置

-Dhibernate.jdbc.use_streams_for_binary=true

我正在用 MySQL5 运行 jBoss6

于 2012-09-26T07:19:04.160 回答