无法在带有MySql的JPA实体中使用java.time.LocalDate [英] Unable To use java.time.LocalDate in JPA entity with MySql

查看:66
本文介绍了无法在带有MySql的JPA实体中使用java.time.LocalDate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的实体中使用LocalDate,这种用法在网络上有很多文档.这就是为什么我感到困惑的原因,它不起作用.

这是我的错误: com.mysql.jdbc.MysqlDataTruncation:数据截断:错误的日期值:'\ xAC \ xED \ x00 \ x05sr \ x00 \ x0Djava.time.Ser \ x95] \ x84 \ xBA \ x1B"H \ xB2 \ x0C \ x00 \ x00xpw \ x07 \ x03 \ x00 \ x00 \ x07 \ xD7 \ x0C \ x03x'

因此,它显然需要转换器.我尝试了以下链接:

表示将弹簧转换器添加到EntityManager的扫描路径.我直接尝试了他的示例(遇到各种错误),并将其改编成我的代码(以下代码确实执行了):

@Autowired
private void configPersistence(LocalContainerEntityManagerFactoryBean factoryBean) {
    factoryBean.setPackagesToScan(Worker.class.getPackage().toString(),"org.springframework.data.jpa.convert.threeten");
}

但是问题仍然存在.

在此处此处,它们都说类似的话.

仅添加hibernate-java8依赖项就不起作用了.

   <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

我已经走得很远,可以独立地实例化转换器bean且没有骰子.一定是其他东西.

更新

如果我从字面上看C& P Spring代码并将其添加为bean,它就可以工作!这不是正确的方法.

@Bean
public AttributeConverter<LocalDate,Date> getConverter() {
    return new LocalDateConverter();
}

@Converter(autoApply = true)
public static class LocalDateConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate date) {
        return Jsr310Converters.LocalDateToDateConverter.INSTANCE.convert(date);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date date) {
        return Jsr310Converters.DateToLocalDateConverter.INSTANCE.convert(date);
    }
}

来自spring-data

的传递依存关系

+- org.hibernate:hibernate-entitymanager:jar:4.3.11.Final:compile
[INFO] |  |  +- org.hibernate:hibernate-core:jar:4.3.11.Final:compile
[INFO] |  |  +- org.hibernate.common:hibernate-commons-annotations:jar:4.0.5.Final:compile
[INFO] |  |  \- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile

结束更新

这是我的实体:

@Entity
public class Worker {
    private Long id;
    private String givenName;
    private String familyName;
    private LocalDate dob;
    private String nationalId;
    private byte[] photo;

    public Worker() {
        this.id = Math.abs(new Random().nextLong());
    }

    @Id
    @Column(name = "ID")
    public Long getId() {
        return id;
    }

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

    @Basic
    @Column(name = "GivenName")
    public String getGivenName() {
        return givenName;
    }

    public void setGivenName(String givenName) {
        this.givenName = givenName;
    }

    @Basic
    @Column(name = "FamilyName")
    public String getFamilyName() {
        return familyName;
    }

    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }

    @Basic
    @Column(name = "DOB")
    public LocalDate getDob() {
        return dob;
    }

    public void setDob(LocalDate dob) {
        this.dob = dob;
    }

    @Basic
    @Column(name = "NationalID")
    public String getNationalId() {
        return nationalId;
    }

    public void setNationalId(String nationalId) {
        this.nationalId = nationalId;
    }

    @Basic
    @Column(name = "photo")
    public byte[] getPhoto() {
        return photo;
    }

    public void setPhoto(byte[] photo) {
        this.photo = photo;
    }
}

解决方案

您需要Hibernate 5.0+和hibernate-java8依赖项才能正常工作.您可以在此处查看5.0更改日志,其中应该显示添加了以下内容: Java 8支持.还有一些官方博客条目在此处.

请检查迁移指南从4.3到5.0以获取更多信息.

I am trying to use LocalDate in my entities and this usage has plenty of documentation around the net. Which is why I am baffled it doesn't work.

Here is my error: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: '\xAC\xED\x00\x05sr\x00\x0Djava.time.Ser\x95]\x84\xBA\x1B"H\xB2\x0C\x00\x00xpw\x07\x03\x00\x00\x07\xD7\x0C\x03x'

So, it obviously needs a converter. I have tried the following links:

This one says to add the spring converters to the scan path for the EntityManager. I directly tried his example (get all kinds of errors) as well as adapting it to my code (below code does indeed execute):

@Autowired
private void configPersistence(LocalContainerEntityManagerFactoryBean factoryBean) {
    factoryBean.setPackagesToScan(Worker.class.getPackage().toString(),"org.springframework.data.jpa.convert.threeten");
}

But the problem persists.

I've been here and here, which all say something similar.

Simply adding the hibernate-java8 dependency doesn't work as it suggests.

   <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

I have gone so far as to independently instantiate the converter bean and no dice. It must be something else.

UPDATE

If I literally C&P the Spring code and add it as a bean, it works!? This is not the right way to do it.

@Bean
public AttributeConverter<LocalDate,Date> getConverter() {
    return new LocalDateConverter();
}

@Converter(autoApply = true)
public static class LocalDateConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate date) {
        return Jsr310Converters.LocalDateToDateConverter.INSTANCE.convert(date);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date date) {
        return Jsr310Converters.DateToLocalDateConverter.INSTANCE.convert(date);
    }
}

Transitive dependencies from spring-data

+- org.hibernate:hibernate-entitymanager:jar:4.3.11.Final:compile
[INFO] |  |  +- org.hibernate:hibernate-core:jar:4.3.11.Final:compile
[INFO] |  |  +- org.hibernate.common:hibernate-commons-annotations:jar:4.0.5.Final:compile
[INFO] |  |  \- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile

End update

Here is my entity:

@Entity
public class Worker {
    private Long id;
    private String givenName;
    private String familyName;
    private LocalDate dob;
    private String nationalId;
    private byte[] photo;

    public Worker() {
        this.id = Math.abs(new Random().nextLong());
    }

    @Id
    @Column(name = "ID")
    public Long getId() {
        return id;
    }

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

    @Basic
    @Column(name = "GivenName")
    public String getGivenName() {
        return givenName;
    }

    public void setGivenName(String givenName) {
        this.givenName = givenName;
    }

    @Basic
    @Column(name = "FamilyName")
    public String getFamilyName() {
        return familyName;
    }

    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }

    @Basic
    @Column(name = "DOB")
    public LocalDate getDob() {
        return dob;
    }

    public void setDob(LocalDate dob) {
        this.dob = dob;
    }

    @Basic
    @Column(name = "NationalID")
    public String getNationalId() {
        return nationalId;
    }

    public void setNationalId(String nationalId) {
        this.nationalId = nationalId;
    }

    @Basic
    @Column(name = "photo")
    public byte[] getPhoto() {
        return photo;
    }

    public void setPhoto(byte[] photo) {
        this.photo = photo;
    }
}

解决方案

You need Hibernate 5.0+ along with the hibernate-java8 dependency for it to work. You can check the 5.0 changelog here which should show the addition of the Java 8 support. Also some official blog entry saying the same here.

Please check the migration guide from 4.3 to 5.0 for additional information.

这篇关于无法在带有MySql的JPA实体中使用java.time.LocalDate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆