为什么不能将JPA / hibernate映射到MySQL blob类型?

时间:2012-02-15 18:22:04

标签: java mysql hibernate jpa

我收到以下错误

Caused by: org.hibernate.HibernateException: Wrong column type in TestTable for column PAYLOAD. Found: blob, expected: tinyblob
    at org.hibernate.mapping.Table.validateColumns(Table.java:284)
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1174)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:139)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:387)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:883)
    ... 60 more

hibernate列抱怨声明为

private byte[]  messagePayload;

@Column(name="PAYLOAD")
public byte[] getMessagePayload() {
        return messagePayload;
}

public void setMessagePayload(byte[] messagePayload) {
 this.messagePayload = messagePayload;
}

MySQL表中的表被声明为BLOB类型。为什么Hibernate不希望映射到它,为什么它坚持使用TINYBLOB?

由于

4 个答案:

答案 0 :(得分:14)

您可以尝试使用 columnDefinition 属性明确设置类型blob。像这样:

@Column(name="PAYLOAD",columnDefinition="blob")

或使用@Lob注释:

@Column(name="PAYLOAD")    
@Lob(type = LobType.BLOB)

答案 1 :(得分:3)

@Column(columnDefinition="blob") 

对我不起作用。 我的规格: - JPA - 休眠 - MySQL

解决方案:

ALTER TABLE `my_table_name` CHANGE `my_column` `my_column` LONGBLOB default NULL;

public MyClass {
   @Lob
   @Column(length=100000)
   private byte[] myBlob;
}         

答案 2 :(得分:0)

我已经尝试过此解决方案:

public class MySqlCustomDialect extends org.hibernate.dialect.MySQLDialect{

    public MySqlCustomDialect() {

        super();

        this.registerColumnType(-4, "blob");
        this.registerColumnType(-3, "blob");
        this.registerColumnType(-3, 16777215L, "blob");
        this.registerColumnType(-3, 65535L, "blob");
        this.registerColumnType(-3, 255L, "blob");
        this.registerColumnType(2004, "blob");

    }
}

这样,我已经覆盖了MySqlDialect中定义的ColumnType的原始值。它仅在BLOB在MySQL中定义为列类型时才有效。如预期的那样,我尝试将列类型更改为LONGBLOB时遇到了副作用:

[longblob(Types#LONGVARBINARY)],但期望[blob(Types#BLOB)]

仅用于先前的重新配置。

答案 3 :(得分:-1)

你好,这对我有用。

@Lob  
@Column(name = "CH_VAL_MODIFIEES")
private String valeurModifiee;

在我的数据库中,我创建了一个 LONGTEXT 数据类型CH_VAL_MODIFIEES