我有以下表格:
+-----------------------------------+
| user |
+------------------------------------
| id | username | role_id |
+----+-------------+----------------+
| 1 | user1 | 1 |
+----+-------------+----------------+
+-----------------------------------+
| role |
+------------------------------------
| role_id | role_name |
+-----------------+-----------------+
| 1 | GUEST |
+-----------------+-----------------+
| 2 | USER |
+-----------------+-----------------+
每个用户都有1个角色。 Fields看起来像这样:
User.java
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="ROLE_ID")
private Role role;
Role.java
@Id
@GeneratedValue
@Column(name = "ROLE_ID", unique = true, nullable = false)
private int id;
Role
表已经只填充了2个角色。当我尝试添加新用户时,新记录将保存在Role
表中。这不是我寻求的行为。我不希望将值写入Role
表(除非表中添加的值不存在)。
知道如何正确实现这一目标吗?很确定这很简单,但我是JPA的新手。
修改:添加用户的代码
user = new User("JoDoe",new Role("USER"));
user = repository.save(user);
正如评论所指出的那样,因为我每次都在创建一个新的角色。有人能说出正确的流量吗?我应该首先通过RoleDao
从数据库中检索角色,然后将该对象分配给新用户吗?或者还有其他方法我错过了吗?
答案 0 :(得分:1)
首先,由于几个用户可以拥有相同的角色,因此您没有OneToOne,而是ManyToOne。
其次,如果您创建一个新角色,甚至没有为其分配ID,并创建具有该新角色的用户,因为该关联具有cascade = ALL
,JPA确实会创建这个新角色。如何知道你真正想要做的是在数据库中找到具有相同名称的角色并将该角色分配给新用户?
这就是你必须做的。假设您拥有新用户的角色ID,您需要的是
Role existingRole = em.getReference(roldId);
User user = new Role(existingRole);
em.persist(user);