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

Java JBoss6 JPA:带有@Lob的实体导致GenericJDBCException,java,mysql,jpa,jboss6.x,lob,Java,Mysql,Jpa,Jboss6.x,Lob,我有一个带有@Lob注释的简单EntityBean。如果删除此注释,JBossas6.0.0.Final和MySQL5上不会出现错误。但是如果我用@Lob注释它(因为在我的例子中mt包含大约100到5000个字符),如果我保留实体,我的测试环境就会出错 没有@Lob:mt映射到VARCHAR 使用@Lob:mt被映射到LONGTEXT(这是我想要的,但我得到了错误) 这是我的实体: @Entity @Table(name = "Description") public class Descr

我有一个带有
@Lob
注释的简单EntityBean。如果删除此注释,JBossas6.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/MySQL的
@Lob
的使用是公认的答案

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

更新2Kimi提出的带
@Column(columnDefinition=“longtext”)
的解决方案即使在OSX上也能很好地工作。在这两种情况下,MySQL都创建相同的列:LONGTEXT

更新3我将MySQL更新为
MySQL-5.5.17-osx10.6-x86_64
,并将连接器更新为
MySQL-connector-java-5.1.18
。仍然是相同的错误。

不需要用
@Lob
注释字符串属性。只需使用
@column(length=10000)
设置列长度即可

编辑:

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

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

  • VARCHAR:65535字节(~64Kb,21844个UTF-8编码字符)
  • 文本:65535字节(~64Kb,21844个UTF-8编码字符)
  • MEDIUMTEXT:16777215字节(~16Mb,~550万UTF-8编码字符)
  • 长文本:4294967295字节(~4GB,~14亿UTF-8编码字符)

据我所知,
@Lob
只是根据基础数据库设置列类型和长度。

另一种对我有效的方法是使用

-Dhibernate.jdbc.use_streams_for_binary=true

我正在用MySQL5运行jBoss6

您的描述表是什么样子的?如果mt是数据库中的varchar,那么为什么要尝试将其映射到Lob?MySQL5是否支持将LONGTEXT作为创建标识符的正确值?我不确定DB应该怎么做。。。增加文本值?@PedroKowalski mt未用作标识符。id字段为。我一开始是这样读的,但代码的格式很差。@mR_fr0g好的,对不起,伙计-我的坏:-)@Thor-正如_fr0g先生所说的-在您的情况下使用Lob有任何目的吗?如果字符串由于某些原因超过10000个字符,会发生什么?请看,您始终可以将长度设置为特定于数据库的最大值,也可以使用
columndefinition
设置来定义列类型,以满足您的需要。例如,如果您使用的是MySQL 5.0.3或更高版本,UTF-8编码的VARCHAR的最大长度为21844个字符(65535字节),这与文本类型的限制相同。MEDIUMTEXT可以容纳16777215字节(约16Mb,约550万个字符)和长文本4294967295字节(约4GB,约14亿个字符)。据我所知,
@Lob
只是将列类型和长度设置为一些特定于数据库的值。因此,如果可移植性没有问题,我会这样做。通过此注释,我得到一个VARCHAR 10000,但是,如果我想存储更多字符,则引发异常
,原因是:com.mysql.jdbc.MysqlDataTruncation:Data truncation:Data too long for column'mt',在第1行
。(抱歉,没有看到您的其他评论,此评论与您的答案相关)我将在答案中添加评论。