当前位置: 首页 > 知识库问答 >
问题:

使用EclipseLink在JPA2.1中注册转换器

慕容宇
2023-03-14

在JavaEE环境中,我将JPA2.1实现与EclipseLink一起使用,

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

    ....
}

CarColor转换器:

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

persistence.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>

>

  • 当我在persistence.xml文件上注释转换器的声明,并试图将我的实体持久化到数据库中时,会出现这样的错误:“请确保转换器类名正确,并且存在于持久化单元定义中。”并且没有编译时间异常,只有一个非常明确的警告:

  • 共有1个答案

    秦渝
    2023-03-14

    我的猜测是您有混合的javax.persistenceorg.eclipse.persistence.annotations包。

    使用javax.persistence包类,可以在转换器类上使用空的converter注释,在指定转换器类的实体类上使用convert注释。

     类似资料:
    • 我正在测试JPA2。1和新的“模式生成”功能。为此,我在HyperSQL数据库下测试了两个实现: Eclipse Link 2.5.2-M1,它是参考实现。 Hibernate4.3 我对实现没有任何偏好(甚至对性能也没有偏好)。我测试了EclipseLink,因为它是第一个JPA2。1实现可用,但现在,Hibernate4.3在这里,JPA2也在这里。1合规。我唯一想要的是获得独立于JPA提供者

    • 为什么它不能与和Java配置一起工作?为什么它与一起使用?

    • 我有一个名为<code>律师</code>的实体,在<code>律师库中有以下代码: 如您所见,我想返回< code > Java lang . control . option 而不是< code>java.util.Optional。它会导致以下异常: org.springframework.core.convert.ConversionFailedException:无法从类型 [java.

    • 我是新来的Spring Boot。在我的控制器中,我使用s作为。缺省情况下,在传递无效的时,Spring返回。 当客户端传递一个无效的时,我想抛出一个自定义的,这样我就可以使用这个异常返回一个自定义的错误。 我试图注册一个定制的(实现)。 为了注册这个组件,我将这个转换器添加到springs。使用。 我还尝试使用而不是这里提到的:Spring没有使用mongo定制转换器 我尝试过的其他解决方案是:

    • 将变量绑定到本机查询时出错。EclipseLink(JPA2.1) 内部异常:org.PostgreSQL.util.psqlException:错误:“$1”位置或附近的语法错误:12错误代码:0线程“awt-eventqueue-0”javax.Persistence.persistenceException:Exception[EclipseLink-4002](Eclipse Persis

    • 所以很明显,添加类型转换器还有其他方式,我通过显式配置转换服务来搞砸了?有没有一种方法可以注册自定义类型转换器而不踩到其他转换器?