【发布时间】:2017-11-25 20:48:30
【问题描述】:
假设我有两个对象,一个是用户对象,另一个是状态对象。 state 对象基本上是美国的 50 个州,所以它永远不必改变。然而,用户对象有一个用户所在的状态集合。像这样:
@Entity
@Table(name="tbl_users")
class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id", unique=true, nullable = false)
private int id;
@Column(name="user_name")
private String name;
@OneToMany(targetEntity=State.class, orphanRemoval = false)
@Column(name="states")
private Collection<State> states;
//getters and setters
}
States 实体如下所示:
@Entity
@Table(name="tbl_states")
class State {
@Id
@Column(name="id", unique=true, nullable=false)
private int id;
@Column(name="state")
private String state;
// getters and setters
}
添加用户的代码(使用休眠):
public int addUser(User user) {
em.persist(user);
em.flush();
return user.getId();
}
通过 id 获取状态的代码:
public State getStateById(int id) {
return em.createQuery("SELECT s FROM State s WHERE s.id =:id, State.class)
.setParameter("id", id)
.getSingleResult();
}
但是当我尝试创建一个用户并选择几个状态时,我得到一个 PSQLException:
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_g6pr701i2pcq7400xrlb0hns"
2017-06-21T22:54:35.959991+00:00 app[web.1]: Detail: Key (states_id)=(5) already exists.
我尝试查找 Cascade 方法以查看是否可以使用任何方法,但 Cascade.MERGE 和 Cascade.PERSIST 似乎做同样的事情,其余的我认为我不需要(REMOVE、DETACH 等) .我的问题是: 如何在不出现该错误的情况下向 User 对象添加状态?
【问题讨论】:
-
在将状态对象添加到用户对象之前如何检索它们?
-
@AbassA 我为每个对象执行 getStateById() 并将状态对象返回到数组列表中,然后我使用 setter 方法将该数组列表添加给用户
-
您能否提供处理保存方法的完整代码。为什么你的集合属性顶部有一个@Column,你不需要这个,我想你有一个表 user_state 支持关系?
-
@AbassA 在前端还是后端?
-
在后端,您用于保存的代码以及您使用 getStateById 方法的位置
标签: java hibernate one-to-many hibernate-mapping cascade