JPA 2.1 属性转换器转换枚举仍然插入 int

Posted

技术标签:

【中文标题】JPA 2.1 属性转换器转换枚举仍然插入 int【英文标题】:JPA 2.1 Attribute Converter convert enum still insert int 【发布时间】:2015-05-01 15:25:11 【问题描述】:

我正在使用带有休眠作为提供程序的 spring data jpa。 我正在尝试将我的枚举保留在 varchar(enum.tostring) 而不是 (0,1,2) 我的枚举类:

public enum MagasinType 
PRINCIPAL 
    @Override
    public String toString() 
        return "Principale".toUpperCase();
    
,
SECONDARY 
    @Override
    public String toString() 
        return "Secondaire".toUpperCase();
    
,
MOBILE 
    @Override
    public String toString() 
        return "Mobile".toUpperCase();
    
;
public abstract String toString();

我的转换器

@Converter(autoApply = true)
public class MagasinConverter implements attributeConverter           <MagasinType,String>

@Override
public String convertToDatabaseColumn(MagasinType magasinType) 
    switch (magasinType)
        case MOBILE:return "MOBILE";
        case PRINCIPAL:return "PRINCIPAL";
        case SECONDARY:return "SECONDARY";
        default:throw new IllegalArgumentException("valeur incorrecte" + magasinType);
    


@Override
public MagasinType convertToEntityAttribute(String s) 
    switch (s)
        case "MOBILE": return MagasinType.MOBILE;
        case "SECONDARY": return MagasinType.SECONDARY;
        case "PRINCIPAL": return MagasinType.PRINCIPAL;
        default:throw new IllegalArgumentException("valeur incorrecte" + s);
    

我的实体

 @Entity
 @Table(name = "MAGASIN")
 public class Magasin extends AbstractEntity 

@Column(name = "LIBELLE", nullable = false)
private String libelle;

@Column(name = "DESCR")
private String descr;


@Convert(converter = MagasinConverter.class)
private MagasinType type;

@Column(name = "LOCATION")
private String localisation;

@Version
private long version;
//getters setters omitted

我的 java 配置:https://gist.github.com/anonymous/480ef7a58cdcc50e7481

我的 app.properties:https://gist.github.com/anonymous/685eaca98fcba9c33872

最后是我的测试方法:https://gist.github.com/anonymous/8bb60fee39a201558e19

请帮助我,我想使用@convert new jpa2.1 功能而不是 @枚举

【问题讨论】:

那么,你想使用枚举的 toString() 还是它的名字?您的文本说您想要 toString(),但您的代码说您想要名称。你面临的问题是什么?具体会发生什么?另外,为什么不发布可以编译的真实代码? @JBNizet 我实现了一个 tostring 来获取字符串值,它可以工作,例如在日志或 sys.out.print 中。但是当我保存实体时,首先将列创建为 INT,并且存储的值为 1.2.3,我希望存储 tostring 值。这也是一个可以编译的真实代码,这是我的仓库,你可以查看github.com/zirconias/RFID_REWRITE 没有标准类被命名为attributeConverter。类总是以大写字母开头。而且您的转换器从不调用 toString():它为枚举 MOBILE 返回“MOBILE”,并对其他枚举成员执行相同操作。所以如果这就是你想要的,你所需要的就是用@Enumerated(STRING)注释实体中的字段 @JBNizet for the attributeConverter it is with A 只是我错过了 a 并再次重写它,感谢您的评论,这就是我试图遵循约定和标准的原因,我知道@ enumerated(enumtype.string) 会起作用,我已经提到过。我正在学习 spring 并尝试测试 java ee7 和 jpa 2.1 的所有新版本(至少尽我所能)。在我的下一条评论中,我将发布解决方案,请您尝试解释一下吗?我没有得到它,但它有效 【参考方案1】:

我尝试将注释放在 getter 上,它可以工作。

现在我可以调用@convert 将枚举转换为字符串,反之亦然。

当我在我的类属性上添加@manytoOne 时发生了同样的问题,我遇到了一个奇怪的问题,没有将列添加到表实体中。

但是当我注释 getter 时。一切都很好。 请查看我的 github 存储库以了解更多信息

https://github.com/zirconias/RFID_REWRITE

【讨论】:

这个提交解决了我的问题github.com/zirconias/RFID_REWRITE/commit/…

以上是关于JPA 2.1 属性转换器转换枚举仍然插入 int的主要内容,如果未能解决你的问题,请参考以下文章

spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter

当集合中的属性更改时在转换器上触发“ConvertBack”?

将枚举转换为核心 2.1 剃须刀页面中的下拉列表

C# Enum,Int,String的互相转换 枚举转换

C# Enum,Int,String的互相转换 枚举转换

如何将 int 转换为枚举?