Spring Data JPA无法正确处理Set <enum> </enum>

时间:2014-12-22 20:33:26

标签: spring hibernate spring-boot jpa spring-data-jpa

我正在尝试Spring Boot(最新版本,使用Hibernate 4.3.7),我的User实体出了问题。这是(最重要的部分):

@Entity
@Table("usr")
public class User {

    public static enum Role {
        UNVERIFIED, BLOCKED, ADMIN
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column
    @ElementCollection
    private Set<Role> roles = new HashSet<Role>();

    (rest of properties, getters and setters etc)
}

我也在使用Spring Boot JPA存储库来保存我的实体:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    User findByEmail(String email);

}

问题在于,当我向Roles集添加一些roles时,Hibernate将无法保存它。它将创建引用表,但它只会将数据插入User表。

我尝试解决此问题,因此我创建了纯Java + Hibernate项目并将我的User类复制到其中。你猜怎么着?它奏效了!

有趣的是,当我在第二个项目中使用纯Hibernate时,创建的roles表看起来与我在Spring Boot项目中创建的表不同。

在我干净的Hibernate项目中,我有以下表格:

User_roles:
   User_Id bigInt(20)
   roles int(11)

在使用Spring JPA时,我得到了

user_roles (notice lower case)
   User (no "_id" part)
   roles

发生了什么事?我做错了什么?它与Spring Boot配置有关吗?感谢。

2 个答案:

答案 0 :(得分:0)

以下内容应与您现有的表格相匹配。

@Entity
@Table("usr")
public class User {

    public static enum Role {
        UNVERIFIED, BLOCKED, ADMIN
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ElementCollection 
    @CollectionTable(name = "User_roles", joinColumns = @JoinColumn(name = "User_Id")
    private Set<Role> roles = new HashSet<Role>();

    (rest of properties, getters and setters etc)
}

答案 1 :(得分:0)

我的解决方案:

  • 角色.java

    公共枚举角色{

    用户、管理员

    }

  • 用户.java

    @Entity

    @Table("usr")

    公共类用户{

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    私有长id;

    @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)

    @JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "id"))

    @Column(name = "roles", nullable = false)

    @Enumerated(EnumType.STRING)

    私有集角色;

    (其余的属性,getter 和 setter 等)

    }