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