使用 EclipseLink 在 JPA 2.1 中注册转换器

2024-04-05

在JavaEE环境中,我使用带有EclipseLink的JPA 2.1实现,

我有一些实体包含enums。所以我为这些枚举创建了转换器。

汽车实体:

@Entity
public class Car implements Serializable {

    private static final long serialVersionUID = 6L;

    @Id
    private String      id;

    @Convert (converter = CarColorConverter.class)
    private CarColor    color;

    public enum CarColor {
        Black,
        Gray,
        White,
        Red
    };

    public Car () {
        id = GenerateUUID.id ();
    }

    ....
}

汽车颜色转换器:

@Converter (converterClass = CarColorConverter.class, name = "CarColorConverter") 
public class CarColorConverter implements AttributeConverter<CarColor, String> { 

    private static final String BLACK   = "Black";
    private static final String GRAY    = "Gray";
    private static final String WHITE   = "White";
    private static final String RED     = "Red";

    @Override
    public String convertToDatabaseColumn (CarColor entityData) {

        switch (entityData) {
            case Black:
                return BLACK;

            case Gray:
                return GRAY;

            case White:
                return WHITE;

            case Red:
                return RED;

            default:
                throw new IllegalArgumentException ("Unknown : " + entityData);
        }
    }

    @Override
    public CarColor convertToEntityAttribute (String dbData) {

        switch (dbData) {
            case BLACK:
                return CarColor.Black;

            case GRAY:
                return CarColor.Gray;

            case WHITE:
                return CarColor.White;

            case RED:
                return CarColor.Red;

            default:
                throw new IllegalArgumentException ("Unknown : " + dbData);
        }
    }
}

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence 
    version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

    <persistence-unit name="xyz-restful-api" transaction-type="RESOURCE_LOCAL">

        <!-- Converters -->
        <!--<class>com.xyz.model.converters.CarColorConverter</class>-->

        <!-- Entities / Model -->
        <class>com.xtz.model.Car</class>

        <properties>
            ...
        </properties>

    </persistence-unit>

</persistence>
  1. When 我评论persistence.xml 文件上的转换器声明,并尝试将我的实体保留在数据库中,但出现此错误:“请确保转换器类名称正确并且与持久性单元定义一起存在。“。并且没有编译时异常,只有一个非常明确的警告:

    类“com.xyz.model.converters.CarTypeConverter”已注释,但未在 persistence.xml 文件中列出

  2. 然而,当我取消注释persistence.xml 文件上的转换器声明,并尝试将我的实体保留在数据库中,但出现此错误:“请确保转换器类名称正确并且与持久性单元定义一起存在。“。以及编译时异常:

    类“com.xyz.model.converters.CarColorConverter”列在 persistence.xml 文件中,但未注释

我是否以错误的方式声明转换器?

谢谢。


尝试一下并确保您已包含正确的软件包。

汽车实体

保持不变

import javax.persistence.Convert;

@Entity
public class Car implements Serializable {

    [...]

    @Convert(converter = CarColorConverter.class)
    private CarColor    color;

    [...]
}

汽车颜色转换器

您只需要空注释

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter
public class CarColorConverter implements AttributeConverter<CarColor, String> {
    [...]
}

持久性.xml

You can either

  • 根本不声明任何类

or

  • 声明涉及的每个类。

一旦您需要手动声明一个实体(例如,当它在库中抵抗时),那么您还需要声明所有其他实体/转换器类。

<?xml version="1.0" encoding="UTF-8"?>
<persistence 
    version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

    <persistence-unit name="xyz-restful-api" transaction-type="RESOURCE_LOCAL">

        <!-- Converters -->
        <class>com.xyz.model.converters.CarColorConverter</class>

        <!-- Entities / Model -->
        <class>com.xtz.model.Car</class>

        [...]
    </persistence-unit>
</persistence>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 EclipseLink 在 JPA 2.1 中注册转换器 的相关文章

随机推荐