Hibernate 4.1 avec HSQLDB donne «exception de données: données de chaîne, troncature à droite»
J'ai un problème très étrange, ai eu lorsque j'ai mis à jour som deps pour le projet.
Je suis maintenant à l'aide de versions suivantes:
- Printemps: 3.1.0.COMMUNIQUÉ de
- Mise en veille prolongée: 4.1.7.Final
- Hsqldb: 2.2.8 (org.hsqldb)
Je PENSE que le problème doit faire quelque chose avec le champ fichier. (Dbfile.le contenu)
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
Console:
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;
}
}
Il échoue sur: 'cvDao.enregistrer(cv).getId();'
Source de données à l'aide de la classe com.mchange.v2.c3p0.ComboPooledDataSource "avec chauffeur" org.hsqldb.jdbcDriver "à l'url de" jdbc:hsqldb:mem:données'
Qu'ai-je fait de mal?
source d'informationauteur Kronis
Vous devez vous connecter pour publier un commentaire.
Essayer de HSQLDB 2.2.9 ou la dernière sanpshot comme la trace de la pile ressemble à un problème qui a été résolu après 2.2.8.
Repository Maven pour les instantanés et les rejets est ici:
http://www.hsqldb.org/repos/org/hsqldb/hsqldb/
Aussi voir la réponse ci-dessous. Il semble que l'utilisation de "org.mise en veille prolongée.type.MaterializedClobType" est commun avec PostgreSQL. Mais le domaine est le byte[] et peut être représentée de mieux que de GOUTTE avec HSQLDB.
Récupérer l'image de blob via Hibernate (pas JDBC)
Le problème est avec HSQLDialect mise en œuvre, qui enregistre les types sql dans son constructeur:
Où $l est pris de la longueur de la colonne d'attribut. Mais si la longueur de la colonne d'attribut n'est pas défini explicitement, puis il a par défaut la valeur de
255
.Dans de tels cas
HSQLDialect
crée une colonne comme CLOB(255) ce qui est drôle pour clobs...1)
Une solution est de mettre la longueur de la colonne explicitement avec une valeur suffisante.
Par exemple:
Mais si vous voulez éviter de telles constructions artificielles, vous pouvez modifier le dialecte.
2)
Deuxième solution est de modifier HSQLDialect:
et dans hibernate configuration du nouveau dialecte:
Je utiliser cette solution dans mes tests d'intégration.
Quelques informations supplémentaires peuvent être trouvées ici:
https://hibernate.atlassian.net/browse/HHH-7541
La bonne réponse devrait être: ajouter de la longueur de votre annotation @Column, comme ceci:
J'ai eu le même problème. Il y avait beaucoup d'erreurs: les "données d'exception: la chaîne de données, troncature". La résolution a été de préciser la taille des grands champs. Sans que les champs seront limitées à la taille par défaut. Mais ce n'est pas tout. HSQL ne sont pas automatiquement mises à jour de schéma de base de données. Ainsi, les changements ne s'appliqueront pas util vous recréer la base de données.
J'ai eu le même message d'erreur, lors de l'une de mes propriétés de la relation manquait la @ManyToOne annotation. La mise à niveau de HSQLDB pour 2.2.9 ne résout pas le problème.
JPA 2 a cette exigence:
Avez-vous ajouter une nouvelle propriété sans l'ajout d'une telle annotation?