2012-10-13 9 views
15

Mam bardzo dziwny problem, mam go, gdy uaktualniłem som deps do projektu.Hibernate 4.1 z HSQLDB daje "wyjątek danych: dane łańcuchowe, właściwe obcięcie"

Obecnie używam następujących wersjach:

  • Wiosna: 3.1.0.RELEASE
  • Hibernate: 4.1.7.Final
  • hsqldb: 2.2.8 (org.hsqldb)

MYŚLĘ, że problem musi coś zrobić z polem pliku. (Dbfile.content)

StackTrace:

javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not insert: [org.project.model.Cv] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1315) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1321) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:843) 
    at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) 
    at $Proxy36.persist(Unknown Source) 
    at org.project.dao.jpa.GenericDaoJpa.save(GenericDaoJpa.java:49) 
    at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at $Proxy40.save(Unknown Source) 
    at org.project.dao.CvDaoTest.updateTest(CvDaoTest.java:77) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.hibernate.exception.DataException: could not insert: [org.project.model.Cv] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:102) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2345) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2852) 
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) 
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) 
    at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69) 
    at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179) 
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135) 
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61) 
    at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808) 
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782) 
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:837) 
    ... 45 more 
Caused by: java.sql.SQLDataException: data exception: string data, right truncation 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) 
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) 
    ... 60 more 
Caused by: org.hsqldb.HsqlException: data exception: string data, right truncation 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.types.BinaryType.castOrConvertToType(Unknown Source) 
    at org.hsqldb.types.BinaryType.convertToType(Unknown Source) 
    at org.hsqldb.StatementDML.getInsertData(Unknown Source) 
    at org.hsqldb.StatementInsert.getInsertValuesNavigator(Unknown Source) 
    at org.hsqldb.StatementInsert.getResult(Unknown Source) 
    at org.hsqldb.StatementDMQL.execute(Unknown Source) 
    at org.hsqldb.Session.executeCompiledStatement(Unknown Source) 
    at org.hsqldb.Session.execute(Unknown Source) 
    ... 65 more 

konsoli:

INFO : org.hibernate.engine.jdbc.JdbcSupportLoader - Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException 
Hibernate: insert into Nationality (id, countryCode) values (default, ?) 
Hibernate: insert into Language (id, countryCode, languageCode) values (default, ?, ?) 
Hibernate: insert into Person (id, birthdate, created, email, enabled, firstName, image, lastName, lastUpdate, nationality_id, password, role, salt) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into Nationality (id, countryCode) values (default, ?) 
Hibernate: insert into Person (id, birthdate, created, email, enabled, firstName, image, lastName, lastUpdate, nationality_id, password, role, salt) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into Company (id, name) values (default, ?) 
Hibernate: insert into Language (id, countryCode, languageCode) values (default, ?, ?) 
Hibernate: insert into Company (id, name) values (default, ?) 
Hibernate: insert into Skill (id, company_id, created, isCategory, lastUpdate, skill_fk) values (default, ?, ?, ?, ?, ?) 
Hibernate: insert into Company (id, name) values (default, ?) 
Hibernate: insert into Skill (id, company_id, created, isCategory, lastUpdate, skill_fk) values (default, ?, ?, ?, ?, ?) 
Hibernate: insert into Nationality (id, countryCode) values (default, ?) 
Hibernate: insert into Person (id, birthdate, created, email, enabled, firstName, image, lastName, lastUpdate, nationality_id, password, role, salt) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into CourseExperience (created, lastUpdate, lastUpdatePerson_id, person_fk, endDate, startDate, id) values (?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into Nationality (id, countryCode) values (default, ?) 
Hibernate: insert into Person (id, birthdate, created, email, enabled, firstName, image, lastName, lastUpdate, nationality_id, password, role, salt) values (default, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into CourseExperience (created, lastUpdate, lastUpdatePerson_id, person_fk, endDate, startDate, id) values (?, ?, ?, ?, ?, ?, ?) 
Hibernate: insert into Cv (id, company, created, language, lastUpdate, lastUpdatePerson_id, name, person_fk, summary_id) values (default, ?, ?, ?, ?, ?, ?, ?, ?) 
WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: -3401, SQLState: 22001 
ERROR: org.hibernate.util.JDBCExceptionReporter - data exception: string data, right truncation 

Cv.java:

package org.project.model; 

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToMany; 
import javax.persistence.ManyToOne; 
import javax.persistence.OneToMany; 
import javax.persistence.OrderBy; 
import javax.persistence.OrderColumn; 
import javax.persistence.PrePersist; 
import javax.persistence.PreUpdate; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 

import org.project.model.interfaces.DomainObject; 

@Entity 
public class Cv implements DomainObject { 

    private static final long serialVersionUID = -9111485038728016755L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(nullable = false) 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "person_fk") 
    private Person person; 

    @ManyToMany 
    private List<Skill> skills = new ArrayList<Skill>(); 

    @ManyToOne 
    private Summary summary; 

    @ManyToMany(targetEntity = Experience.class) 
    @OrderColumn(name = "index") 
    private List<Experience> experiences = new ArrayList<Experience>(); 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(updatable = false, insertable = true) 
    private Date created; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date lastUpdate; 

    @ManyToOne(optional = false) 
    private Person lastUpdatePerson; 

    @Column(nullable = false) 
    private Language language; 

    @Column(nullable = false) 
    private Company company; 

    @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, targetEntity = DbFile.class) 
    @OrderBy("created DESC") 
    private List<DbFile> files = new ArrayList<DbFile>(); 

    @PrePersist 
    @PreUpdate 
    protected void updateDates() { 
     Date now = new Date(); 
     if (this.created == null) { 
      this.created = new Date(now.getTime()); 
     } 
     this.lastUpdate = now; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Person getPerson() { 
     return person; 
    } 

    public void setPerson(Person person) { 
     this.person = person; 
    } 

    public List<Skill> getSkills() { 
     return skills; 
    } 

    public void setSkills(List<Skill> skills) { 
     this.skills = skills; 
    } 

    public List<Experience> getExperiences() { 
     return experiences; 
    } 

    public void setExperiences(List<Experience> experiences) { 
     this.experiences = experiences; 
    } 

    public Date getCreated() { 
     return created; 
    } 

    public void setCreated(Date created) { 
     this.created = created; 
    } 

    public Date getLastUpdate() { 
     return lastUpdate; 
    } 

    public void setLastUpdate(Date lastUpdate) { 
     this.lastUpdate = lastUpdate; 
    } 

    public Person getLastUpdatePerson() { 
     return lastUpdatePerson; 
    } 

    public void setLastUpdatePerson(Person lastUpdatePerson) { 
     this.lastUpdatePerson = lastUpdatePerson; 
    } 

    public void addSkill(Skill skill) { 
     this.skills.add(skill); 
    } 

    public void addExperience(Experience experience) { 
     this.experiences.add(experience); 
    } 

    public Summary getSummary() { 
     return summary; 
    } 

    public void setSummary(Summary summary) { 
     this.summary = summary; 
    } 

    public List<DbFile> getFiles() { 
     return files; 
    } 

    public void setFiles(List<DbFile> files) { 
     this.files = files; 
    } 

    public void addFile(DbFile file) { 
     this.files.add(file); 
    } 

    public Company getCompany() { 
     return company; 
    } 

    public void setCompany(Company company) { 
     this.company = company; 
    } 

    public Language getLanguage() { 
     return language; 
    } 

    public void setLanguage(Language language) { 
     this.language = language; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((id == null) ? 0 : id.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Cv other = (Cv) obj; 
     if (id == null) { 
      if (other.id != null) 
       return false; 
     } else if (!id.equals(other.id)) 
      return false; 
     return true; 
    } 
} 

DbFile.java:

package org.project.model; 

import java.util.Date; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Lob; 
import javax.persistence.PrePersist; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 

import org.hibernate.annotations.Type; 

import org.project.model.interfaces.DomainObject; 

@Entity 
public class DbFile implements DomainObject { 

    private static final long serialVersionUID = 1974800702358176016L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String filename; 

    @Column(nullable = false) 
    @Lob 
    @Type(type = "org.hibernate.type.MaterializedClobType") 
    private byte[] content; 

    private String contentType; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(updatable = false) 
    private Date created; 

    @PrePersist 
    protected void updateDates() { 
     if (this.created == null) { 
      this.created = new Date(); 
     } 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getFilename() { 
     return filename; 
    } 

    public void setFilename(String filename) { 
     this.filename = filename; 
    } 

    public byte[] getContent() { 
     return content; 
    } 

    public void setContent(byte[] content) { 
     this.content = content; 
    } 

    public String getContentType() { 
     return contentType; 
    } 

    public void setContentType(String contentType) { 
     this.contentType = contentType; 
    } 

    public Date getCreated() { 
     return created; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((id == null) ? 0 : id.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     DbFile other = (DbFile) obj; 
     if (id == null) { 
      if (other.id != null) 
       return false; 
     } else if (!id.equals(other.id)) 
      return false; 
     return true; 
    } 
} 

Test:

@Transactional 
@RunWith(SpringJUnit4ClassRunner.class) 
... 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
public class CvDaoTest extends AbstractTest { 

    @Autowired 
    private CvDao cvDao; 

    @Test 
    public void updateTest() { 
     Cv cv = new Cv(); 
     cv.setName("test"); 

     ... 
     cv.setLastUpdatePerson(lastUpdatePerson); 

     ... 
     cv.setPerson(person); 
     cv.setCreated(new Date()); 
     cv.setLastUpdate(new Date()); 

     cv.setCompany(getCompany()); 
     cv.setLanguage(getLanguage()); 

     ... 
     cv.addSkill(skill1); 
     cv.addSkill(skill2); 

     ... 
     cv.addExperience(experience1); 
     cv.addExperience(experience2); 

     cvDao.save(cv).getId(); 
    } 
} 

GenericDaoJpa.java

public class GenericDaoJpa<T extends DomainObject> implements GenericDao<T> { 

    private Class<T> type; 
// @PersistenceContext 
    protected EntityManager entityManager; 

    @PersistenceContext 
    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

    public GenericDaoJpa(Class<T> type) { 
     super(); 
     this.type = type; 
    } 

    @Transactional(readOnly = true) 
    public T get(Long id) { 
     if (id == null) { 
      return null; 
     } else { 
      return entityManager.find(type, id); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    @Transactional(readOnly = true) 
    public List<T> getAll() { 
     return entityManager.createQuery("select o from " + type.getName() + " o").getResultList(); 
    } 

    @Transactional(readOnly = false) 
    public T save(T object) { 
     if (object.getId() != null) { 
      return entityManager.merge(object); 
     } else { 
      entityManager.persist(object); 
     } 
     entityManager.flush(); 
     return object; 
    } 

    public T delete(T object) { 
     entityManager.remove(object); 
     return object; 
    } 
} 

To nie działa na: „cvDao.save (cv) .getId (); "

DataSource za pomocą klasy 'com.mchange.v2.c3p0.ComboPooledDataSource' z kierowcą 'org.hsqldb.jdbcDriver' pod adresem URL 'jdbc: hsqldb: mem: Dane'

Co zrobiłem źle?

+0

Trudno powiedzieć, nie widząc dane chcesz utrzymywać. Czy używasz narzędzi generowania schematów Hibernuj do tworzenia schematu? Następnie możesz użyć @Length do określenia rozmiaru kolumn, aby upewnić się, że treść faktycznie pasuje do odpowiednich kolumn. –

+0

@StefanHaberl Dodałem kod Test i GenericDaoJpa.java.Nie powiedzie się na ostatniej linii testu, na "cvDao.save (cv)" – Kronis

+0

Hmm. Metoda save() w generycznym DAO wydaje się być w porządku po szybkim spojrzeniu (chociaż nie rozumiem, dlaczego chcesz scalić() tutaj - czy pracujesz z odłączonymi jednostkami, które chcesz ponownie dołączyć do sesji?) , czy sprawdziłeś, czy długość łańcucha pasuje do rozmiarów kolumn? –

Odpowiedz

1

Wypróbuj HSQLDB 2.2.9 lub najnowszy sanpshot, ponieważ ślad stosu wygląda jak problem, który został naprawiony po 2.2.8.

Maven repozytorium dla obu ujęć i publikacji jest tutaj:

http://www.hsqldb.org/repos/org/hsqldb/hsqldb/

zobaczyć również odpowiedź poniżej. Wydaje się, że użycie "org.hibernate.type.MaterializedClobType" jest typowe dla PostgreSQL. Ale twoje pole to bajt [] i może być lepiej reprezentowane jako BLOB z HSQLDB.

Retrieve image from blob via Hibernate (not JDBC)

+0

Nie pomogło:/ – Kronis

+1

Petar Tahchiev zapewnił lepszą odpowiedź. pracował dla mnie na HSQL 2.3.2 – Chris

0

Mam ten sam komunikat o błędzie, gdy jeden z moich właściwości relacji brakowało adnotacji @ManyToOne. Aktualizacja HSQLDB do wersji 2.2.9 nie rozwiązała problemu.

JPA 2 ma ten wymóg:

"Relacja minimalnie wymaga adnotacji związek, albo @OneToMany lub @ManyToMany"

Czy dodać nową właściwość bez dodawania takiej adnotacji?

10

Prawidłowa odpowiedź powinna wynosić: długość dodać do swojej @Column adnotacji, tak:

@Lob 
@Column(length = 10000, name = "style") 
private String style; 
+0

Jak mogłeś przechowywać pliki większe niż 2G? –

4

miałem podobny problem. Wystąpiło wiele błędów: "wyjątek danych: ciąg danych, właściwe obcięcie". Rozdzielczość miała określać wielkość dużych pól. Bez tego pola będą ograniczone do domyślnego rozmiaru. Ale to nie wszystko. HSQL nie aktualizuje automatycznie schematu bazy danych. Więc zmiany nie będą miały zastosowania przy ponownym tworzeniu bazy danych.

@Column(length = 5 * 1024 * 1024) // five megabytes 
private byte[] bytesPreview; 
20

Problem jest z HSQLDialect wykonania, który rejestruje sql typów w konstruktor

public HSQLDialect() { 
    super(); 

    ... 
    registerColumnType(Types.BLOB, "blob($l)"); 
    registerColumnType(Types.CLOB, "clob($l)"); 
    ... 
} 

przypadku l $ pochodzi z kolumnowej wartość atrybutu. Ale jeśli atrybut długości kolumny nie jest jawnie ustawiony, ma on domyślną wartość 255. W takim przypadku HSQLDialect tworzy kolumnę jako CLOB (255) który jest zabawny dla CLOB ...

1)

Jednym rozwiązaniem jest ustawienie długości kolumny wyraźnie wystarczającej wartości.

Na przykład:

@Lob 
@Column(length = 10000) 
private String text; 

Ale jeśli chcesz uniknąć takich sztuczne konstrukcje, które można modyfikować dialektem.

2)

drugie rozwiązanie jest modyfikować HSQLDialect:

package com.extensions.dialect; 

import java.sql.Types; 
import org.hibernate.dialect.HSQLDialect; 

public class MyHsqlDialect extends HSQLDialect { 

    public MppHsqlDialect() { 
     super(); 
     registerColumnType(Types.CLOB, "clob"); 
    } 
} 

i hibernacji konfiguracji konfiguracja nowego dialektu:

hibernate.dialect=com.extensions.dialect.MyHsqlDialect 

Używam tego rozwiązania w moich testów integracyjnych.


Niektóre Dodatkowe informacje można znaleźć tutaj:

https://hibernate.atlassian.net/browse/HHH-7541

Powiązane problemy