可以說我有兩個對象,一個是用戶對象,另一個是狀態對象。國家對象基本上是美國的50個州,所以它不必改變。然而,用戶對象具有用戶所在的國家集合。所以像這樣的:將對象A中的對象添加到對象B中而不創建新對象? HIBERNATE
@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
}
和美國實體看起來是這樣的:
@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
}
代碼添加用戶(使用Hibernate):
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.MERGE和Cascade.PERSIST似乎做同樣的事情,其餘的我不認爲我需要(REMOVE,DETACH等)。我的問題是: 如何在沒有該錯誤的情況下向User對象添加狀態?
在將它們添加到用戶對象之前,如何檢索狀態對象? –
@Aassass我爲每個做了一個getStateById(),它將狀態Object返回到數組列表中,然後使用setter方法將該數組列表添加到用戶中 – Aria
您可以提供處理保存方法的完整代碼。爲什麼你的collection屬性之上有一個@Column,你不需要這個,我想你有一個支持關係的表user_state? –