2012-02-15 12 views
6

ho ottenuto il seguente errorePerché non inserire JPA/hibernate map in MySQL blob?

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 

La colonna di ibernazione si lamenta è dichiarato come

private byte[] messagePayload; 

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

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

La tabella in tabella MySQL è dichiarato come un tipo BLOB. Perché Hibernate non vuole mapparlo e perché insiste a usare TINYBLOB?

Grazie

risposta

11

Si potrebbe provare a impostare in modo esplicito il tipo blob con ColumnDefinition attributo. Come questo:

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

Oppure utilizzare l'annotazione @Lob:

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

'columnDefinition' non è portabile, in seguito è di serie. 'type' è disponibile in ibernazione mentre non è in JPA. –

+0

Ho fatto il secondo con EclipseLink e MySQL e posso verificare che funzioni come previsto. –

+0

Ho aggiunto un commento per ulteriori informazioni alla risposta in quanto OP ha menzionato i tag JPA/Hibernate, non per il suo funzionamento. –

2
@Column(columnDefinition="blob") 

non ha funzionato per me. mie specifiche: - JPA - Hibernate - MySQL

Soluzione:

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

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