JPA and enum type

4

我在JPA实体中使用了一个枚举类型的字段:

@Enumerated(value=EnumType.STRING)
private Temperament temperament = Temperament.MINEUR_PUR;

我的枚举类型是在实体类中声明的:

@Entity
public class Joueur implements Serializable {

.....

    public enum Temperament{
        MINEUR_PUR(30),
        MINEUR(10),
        NEUTRE(0),
        RAIDEUR(-10),
        RAIDEUR_PUR(-30);

        private int temperament_prod_mines;

        private Temperament(int temperament_prod_mines){
            this.temperament_prod_mines = temperament_prod_mines;       
        }

        public int getTemperament_prod_mines() {
            return temperament_prod_mines;
        }

        public void setTemperament_prod_mines(int temperament_prod_mines) {
            this.temperament_prod_mines = temperament_prod_mines;
        }
    }   
}

当我将枚举类型“externalize”到它自己的文件中时,它就不能正常工作:

由于异常 [EclipseLink-7151] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException 异常描述:实体类 [class com.sim.entities.Joueur] 上属性 [temperament] 的类型 [class com.sim.basics.enums.Temperament] 不是可枚举映射的有效类型。该属性必须定义为Java枚举。

但这只是复制/粘贴...

为什么会出现这种情况?

谢谢


你把枚举放在单独的lib.jar中了吗? - Aksel Willgert
确实是这样。它与Maven一起打包在EAR中,我的实体及其枚举类型不在同一个JAR包中。我将在同一个JAR包中进行测试。感谢这个想法。 - Olivier J.
当包含枚举的 .jar 对于实体不可见时,我最终出现了完全相同的症状。 - Aksel Willgert
当我将我的枚举与实体放在同一个JAR包中时,它导致了问题。有没有解决方法可以使我的枚举保持在实体JAR包之外?谢谢。 - Olivier J.
谢谢您的快速回答,我会测试一下。 - Olivier J.
显示剩余2条评论
2个回答

5

这个问题的一个原因是在运行时,实体无法在类路径上找到enum.jar中定义的枚举。

至少有两种解决方法:

  1. 在entity.jar的META-INF/MANIFEST.MF中添加:

    classpath: enum.jar

  2. 如果你使用maven,可以将enum.jar指定为EAR的一部分。


0

这个EclipseLink异常错误参考(ELUG)可能会对您有所帮助。

ECLIPSELINK-07151:实体类[{2}]上属性[{0}]的类型[{1}]不是枚举映射的有效类型。该属性必须定义为Java枚举。

原因:在实体类ClassName的访问器方法methodName中指定了无效的EJB 3.0注释。它不被支持。

操作:在此访问器方法上指定一个有效的注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接