我正在尝试实现基本的用户/角色
用户可以具有零到多个角色。
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
。
问题内容: 我有 以下内容: 所以,我的数据库为是 现在,我想用键和值搜索实体。 但是出现以下错误: 我参考过的参考书之一是:Spring Data JPA教程第四部分:JPA标准查询, 但对我来说没有运气。 问题答案: 该解决方案是不是。
看了几个网页后,我仍然不明白为什么我的@ElementCollection会急切地加载。我的理解是,默认情况下任何@ElementCollection都应该总是懒洋洋地加载。正如您所看到的,情况并非如此--您将在本文末尾看到控制台的输出。我试图使用@ElementCollection(fetch=fetchType.lazy)注释强制执行惰性加载,但这并没有改变任何事情。有没有人可以解释一下,也可
问题内容: 给定以下结构,我想执行以下SQL的HQL或CriteriaQuery等效项: 我想找回与给定人员关联的位置列表,其creationDate在给定位置之后。 提前致谢! 标记 编辑***:我已经编辑了SQL,因为这有点误导。我不想独立查询位置。 问题答案: 这是不可能的,您无法查询。从JPA Wikibook: 嵌入式收藏 的映射可以被用来定义的集合 的对象。这不是对象的典型用法,因为对
我遇到了一个问题,在我的JPA表中没有任何内容被持久化。据我所知,我想我理解了的基本思想。我猜出现问题的原因是,我在一个可嵌入的对象中有一个。 一个简单的例子: 有什么线索表明可能出了什么问题吗? 为了简洁起见,我将尽量使附加信息尽可能简短。 创建计算原因 创建计算历史记录 调试信息在计算历史#创建 HibernateDAO仓库 Hibernate生成的SQL 看起来HiberNate甚至没有生成
问题内容: @Entity public class Person { 给定以下类结构,当我尝试将新位置添加到“人的位置”列表中时,它总是导致以下SQL查询: 和 Hibernate(3.5.x / JPA 2)删除给定Person的所有关联记录,然后重新插入所有以前的记录以及新的记录。 我有一个想法,即Location上的equals / hashcode方法可以解决此问题,但是它没有任何改变。
尽管遵循了网络上的所有示例,但我很难让@MapsId工作。 这是我的设置: pom.xml: DDL脚本: ProjectId.java: Project.java: 订阅.java: 当我进行插入时,会发生以下错误: Hibernate:插入t。项目(name,subscription_id)值(?,?)2014年7月20日11:06:59193 org.hibernate.engine.jdb