gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:25:52 24 4
gpt4 key购买 nike

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

....
}

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

持久性.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 文件上声明转换器,并尝试将我的实体保留在数据库中我收到此错误:“ 请确保转换器类名称正确且存在于持久性单元定义中。” .并且没有编译时异常,只有一个非常明确的警告:

    Class "com.xyz.model.converters.CarTypeConverter" is annotated, but not listed in the persistence.xml file

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

    Class "com.xyz.model.converters.CarColorConverter" is listed in the persistence.xml file, but is not annotated


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

    谢谢你。

    最佳答案

    试一试并确保您包含了正确的包。

    汽车实体

    保持不变

    import javax.persistence.Convert;

    @Entity
    public class Car implements Serializable {

    [...]

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

    [...]
    }

    汽车颜色转换器

    你只需要空的 Annotation
    import javax.persistence.AttributeConverter;
    import javax.persistence.Converter;

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

    持久化文件

    您可以 要么
  • 根本不声明类


  • 声明涉及的每个类。

  • 一旦您需要手动声明实体(例如,当它在库中抵抗时),那么您还需要声明所有其他实体/转换器类。
    <?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>

    关于java - 使用 EclipseLink 在 JPA 2.1 中注册转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27574855/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com