我正在尝试实现基本的用户/角色
一个用户可以拥有零到多个角色。
public enum Role {
ROLE_USER,
ROLE_ADMIN;
}
@Entity
@Table(name = "USERS")
public class User implements Serializable {
private static final long serialVersionUID = 2936736450886451500L;
private Long id;
private Individual individual;
private Set<Role> roles = new HashSet<Role>();
@Id
@Column(name = "ID")
@GeneratedValue
public Long getId() {
return id;
}
@SuppressWarnings("unused")
private void setId(Long id) {
this.id = id;
}
@ElementCollection(targetClass=Role.class)
@JoinTable(name = "USER_ROLES", joinColumns = @JoinColumn(name = "USER_ID"))
@Enumerated(EnumType.STRING)
@Column(name = "role", nullable = false)
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
public void addRole(Role role) {
roles.add(role);
}
}
我的单元测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/META-INF/spring/resources/resource-context.xml", "classpath:/META-INF/spring/services/persistence-context.xml"})
public class UserDaoJpaImplTest {
@Autowired
UserDao userDao;
@Transactional
@Test
public void testCreate() {
User user = new User();
user.setIndividual(new Individual());
user.addRole(Role.ROLE_USER);
user.addRole(Role.ROLE_ADMIN);
userDao.create(user);
Assert.assertNotSame(user.getId(), 0);
}
问题是,jpa(由 hibernate 支持)没有在 USER_ROLES 表上执行插入操作(它正在正确创建它,并使用正确的复合 PK(ROLE、USER_ID)和用户的 FK。
我可以在控制台中看到,用户只完成了一次插入
Hibernate: insert into USERS (INDIVIDUAL_ID) values ( ? )
Hibernate: insert into INDIVIDUALS values ( )
我想我只是错过了一些简单的东西。
最佳答案
在刷新持久性上下文期间,集合的元素被插入到数据库中。默认情况下,SpringJUnit4ClassRunner
在 @Transactional
测试后触发回滚,因此不会在事务提交时自动刷新。
您需要使用 @Rollback(false)
或 @TransactionConfiguraton(defaultRollback = false)
覆盖此行为,或者仅使用 flush( 触发显式刷新)
方法。
此外,如果您需要覆盖集合表的默认属性,您应该使用@CollectionTable
,而不是@JoinTable
。
关于java - JPA @ElementCollection @Enumerated 不插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10227747/