mysql - 使用 JPA/Hibernate,如何将 Java 枚举映射到 MySQL 表中的列?

标签 mysql hibernate jpa enums jpa-2.0

我正在使用 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 不感兴趣(需要考虑很多值),除非那是绝对最简单的解决方案。

最佳答案

@Enumerated(value=EnumType.STRING)

使用 ENUM 的值 学生 老师

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

关于mysql - 使用 JPA/Hibernate,如何将 Java 枚举映射到 MySQL 表中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21442363/

相关文章:

java - Java中基于用户输入的MySQL查询

mysql - 在获取结果中附加虚拟数据

multithreading - 线程中的 hibernate session

java - TreeMap 内的顺序错误

php - 由于不同的 MySQL 版本导致不可预测的行为

php - Zend Framework 分组案例

mysql - 设置CENTOS 6 mysql字符集为UTF8

java - 具有列表 getter 的 Hibernate HQL

java - JPA/Hibernate 双向多对一导致 StackOverflowException

java - 使用@GeneratedValue(strategy=GenerationType.TABLE),sequence_next_hi_value 是一个 int(11) 但我的表有一个 id 列 bigint(20)