首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA @ElementCollection @Enumerated未插入

JPA @ElementCollection @Enumerated未插入
EN

Stack Overflow用户
提问于 2012-04-19 20:09:57
回答 1查看 4.5K关注 0票数 1

我正在尝试实现基本用户/角色

一个用户可以有零到多个角色。

代码语言:javascript
复制
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);
  }

}

我的单元测试

代码语言:javascript
复制
@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 (角色、USER_ID)和FK到用户)正确地创建了它。

我可以在控制台中看到,在用户上只执行了一次插入

代码语言:javascript
复制
Hibernate: insert into USERS (INDIVIDUAL_ID) values ( ? )
Hibernate: insert into INDIVIDUALS values ( )

我想我只是错过了一些简单的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-19 20:52:51

在持久化上下文刷新期间,集合的元素被插入到数据库中。默认情况下,SpringJUnit4ClassRunner会在@Transactional测试后触发回滚,因此不会在事务提交时自动刷新。

您需要使用@Rollback(false)@TransactionConfiguraton(defaultRollback = false)覆盖此行为,或者仅使用flush()方法触发显式刷新。

另外,如果你需要覆盖集合表的默认属性,你应该使用@CollectionTable,而不是@JoinTable

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10227747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档