我正在尝试实现基本的用户/角色
用户可以具有零到多个角色。
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测试后会触发回滚,因此不会在事务提交时自动刷新。
SpringJUnit4ClassRunner
@Transactional
您需要使用@Rollback(false)或覆盖此行为@TransactionConfiguraton(defaultRollback = false),或者仅使用flush()方法触发显式刷新。
@Rollback(false)
@TransactionConfiguraton(defaultRollback = false)
flush()
另外,如果您需要覆盖收集表的默认属性,则应使用@CollectionTable而不是@JoinTable。
@CollectionTable
@JoinTable