spring 带有 HSQLDB 的 Hibernate 4.1 给出“数据异常:字符串数据,右截断”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12876551/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 05:26:02  来源:igfitidea点击:

Hibernate 4.1 with HSQLDB gives 'data exception: string data, right truncation'

springhibernatejpahsqldbc3p0

提问by Kronis

I have a very strange problem, got it when I upgraded som deps to the project.

我有一个很奇怪的问题,当我将 som deps 升级到项目时得到了它。

I'm now using following versions:

我现在使用以下版本:

  • Spring: 3.1.0.RELEASE
  • Hibernate: 4.1.7.Final
  • Hsqldb: 2.2.8 (org.hsqldb)
  • 春天:3.1.0.RELEASE
  • 休眠:4.1.7.Final
  • Hsqldb: 2.2.8 (org.hsqldb)

I THINK the problem has to do something with the file field. (Dbfile.content)

我认为问题与文件字段有关。(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.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.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access
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
0(ParentRunner.java:42) at org.junit.runners.ParentRunner.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:

安慰:

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;
    }
}

Cv.java:

简历.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;
    }
}

DbFile.java:

DbFile.java:

@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();
    }
}

Test:

测试:

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;
    }
}

GenericDaoJpa.java

通用DaoJpa.java

public HSQLDialect() {
    super();

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

It fails on: 'cvDao.save(cv).getId();'

它失败了:'cvDao.save(cv).getId();'

Datasource using class 'com.mchange.v2.c3p0.ComboPooledDataSource' with driver 'org.hsqldb.jdbcDriver' at url 'jdbc:hsqldb:mem:data'

数据源使用类 'com.mchange.v2.c3p0.ComboPooledDataSource' 和驱动程序 'org.hsqldb.jdbcDriver' 在 url 'jdbc:hsqldb:mem:data'

What have I done wrong?

我做错了什么?

采纳答案by fredt

Try HSQLDB 2.2.9 or the latest sanpshot as the stack trace looks like an issue that was fixed after 2.2.8.

尝试 HSQLDB 2.2.9 或最新的 sanpshot,因为堆栈跟踪看起来像是 2.2.8 之后修复的问题。

Maven repository for both snapshots and releases is here:

快照和发布的 Maven 存储库在这里:

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

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

Also see the answer below. It seems the use of "org.hibernate.type.MaterializedClobType" is common with PostgreSQL. But your field is byte[] and can be represented better as BLOB with HSQLDB.

另请参阅下面的答案。似乎“org.hibernate.type.MaterializedClobType”的使用在 PostgreSQL 中很常见。但是您的字段是 byte[] 并且可以用 HSQLDB 更好地表示为 BLOB。

Retrieve image from blob via Hibernate (not JDBC)

通过 Hibernate(不是 JDBC)从 blob 中检索图像

回答by przemek hertel

The problem is with HSQLDialectimplementation, which registers sql types in its constructor:

问题在于HSQLDialect实现,它在其构造函数中注册了 sql 类型:

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

Where $lis taken from column length attribute. But if column length attribute is not set explicitly then it has default value of 255. In such case HSQLDialectcreates column as CLOB(255)which is funny for clobs...

其中$l取自列长度​​属性。但是如果没有明确设置列长度属性,那么它的默认值为255. 在这种情况下,将HSQLDialect列创建为CLOB(255)这对于 clobs 来说很有趣......

1)

1)

One solution is to set column length explicitly with sufficient value.

一种解决方案是使用足够的值显式设置列长度。

For example:

例如:

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");
    }
}

But if you want to avoid such artificial constructs, you can modify dialect.

但是如果你想避免这种人为的构造,你可以修改方言。

2)

2)

Second solution is to modifyHSQLDialect:

第二种解决方案是修改HSQLDialect:

hibernate.dialect=com.extensions.dialect.MyHsqlDialect

and in hibernate configuration setup new dialect:

并在休眠配置设置新方言:

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

I use this solution in my integration tests.

我在集成测试中使用了这个解决方案。



Some additional info may be found here:

可以在此处找到一些其他信息:

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

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

回答by Petar Tahchiev

The correct answer should be: add length to your @Column annotation, like this:

正确答案应该是:将长度添加到 @Column 注释中,如下所示:

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

回答by yuliskov

I've had similar problem. There was plenty of errors: "data exception: string data, right truncation". The resolution was to specify size of big fields. Without that fields will be limited to default size. But that is not all. HSQL doesn't automatically updates database schema. So changes will not apply util you recreate database.

我有过类似的问题。有很多错误:“数据异常:字符串数据,右截断”。决议是指定大字段的大小。没有那个字段将被限制为默认大小。但这还不是全部。HSQL 不会自动更新数据库架构。因此更改不会应用您重新创建数据库的 util。

##代码##

回答by Mr Auni

I got the same error message, when one of my relationship properties were missing the @ManyToOne annotation. Upgrading HSQLDB to 2.2.9 did not solve the problem.

当我的关系属性之一缺少 @ManyToOne 注释时,我收到了相同的错误消息。将 HSQLDB 升级到 2.2.9 并没有解决问题。

JPA 2 has this requirement:

JPA 2 有这个要求:

"A relationship minimally requires the relationship annotation, either @OneToMany or @ManyToMany"

“关系至少需要关系注释,@OneToMany 或 @ManyToMany”

Did you add a new property without adding such annotation?

您是否在没有添加此类注释的情况下添加了新属性?