我正在尝试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
配置有关吗?感谢。
答案 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 等)
}