【问题标题】:Using JPA/Hibernate, how do I map a Java enum to a column in my MySQL table?使用 JPA/Hibernate,如何将 Java 枚举映射到 MySQL 表中的列?
【发布时间】:2014-02-21 22:07:39
【问题描述】:

我正在使用 Hibernate 4.3.0.Final (JPA 2.1) 和 MySQL 5.5。我想将我的 Java 枚举映射到具有相应值的 MySQL 表。所以我的枚举是

public enum Roles
{
    STUDENT("Student"),
    TEACHER("Teacher"),
    …

    Roles(final String name)
    {
        this.name = name;
    }

    private final String name;

    @Override
    public String toString()
    {
        return getName();
    }

    public String getName()
    {
        return this.name;
    }
}

我的表包含类似的值

+------------------------+------------------------+-------------+
| ID                     | NAME                   | ADMIN_LEVEL |
+------------------------+------------------------+-------------+
| Student                | Student                |           1 |
| Teacher                | Teacher                |          10 |

那么,在代表上表的一个实体类中,我有

@GenericGenerator(name = "uuid-strategy", strategy = "org.mainco.subco.core.util.subcoUUIDGenerator")
@Entity(name = "sb_role")
public class Role implements Serializable, Comparable<Role>
{

    @Id
    @NotNull
    @GeneratedValue(generator = "uuid-strategy")
    @Column(name = "ID")
    /* the database id of the role */
    private String id;

    @Enumerated(value=EnumType.STRING)
    @Column(name = "NAME")
    /* the String name of the role */
    private Roles name;

但是,当我运行我的应用程序时,我遇到了如下错误。如何强制枚举值和数据库中的列之间的完整性?

java.lang.IllegalArgumentException: Parameter value [Student] did not match expected type [org.mainco.subco.user.domain.Roles (n/a)]
    at org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryImpl.java:885)
    at org.hibernate.jpa.internal.QueryImpl.access$000(QueryImpl.java:80)
    at org.hibernate.jpa.internal.QueryImpl$ParameterRegistrationImpl.bindValue(QueryImpl.java:248)
    at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:631)
    at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:179)
    at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:49)
    at org.hibernate.jpa.criteria.compile.CriteriaCompiler$1$1.bind(CriteriaCompiler.java:126)
    at org.hibernate.jpa.criteria.CriteriaQueryImpl$1.buildCompiledQuery(CriteriaQueryImpl.java:386)
    at org.hibernate.jpa.criteria.compile.CriteriaCompiler.compile(CriteriaCompiler.java:147)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:736)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:241)
    at com.sun.proxy.$Proxy71.createQuery(Unknown Source)
    at org.mainco.subco.core.repo.AbstractHibernateDAO.findByUniqueConstraint(AbstractHibernateDAO.java:104)
    at org.mainco.subco.user.repo.RoleDaoImpl.findRoleByName(RoleDaoImpl.java:26)
    at org.mainco.subco.user.service.RoleServiceImpl.findByName(RoleServiceImpl.java:43)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at com.sun.proxy.$Proxy91.findByName(Unknown Source)
    at org.mainco.subco.resource.service.ResourceServiceIT.testFindById(ResourceServiceIT.java:95)

我对编写 @Converter 不感兴趣(要考虑的值太多了),除非那是绝对最简单的解决方案。

【问题讨论】:

    标签: mysql hibernate jpa enums jpa-2.0


    【解决方案1】:

    @Enumerated(value=EnumType.STRING)

    使用 ENUM 的值 学生 老师

    不是你在括号中的那个,在你的数据库中你有以小写开头的值 在数据库中进行更新以使该列中的所有值都大写,这是最简单的解决方案,它应该可以工作,并且不会影响数据完整性。 XD。

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 2019-10-09
      • 2023-03-20
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多