2つのオブジェクトがあるとしましょう.1つはUserオブジェクトで、もう1つはStateオブジェクトです。状態オブジェクトは、基本的にアメリカの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
}
コード(休止状態を使用して)ユーザーを追加する:idで状態を取得するための
public int addUser(User user) {
em.persist(user);
em.flush();
return user.getId();
}
コード:
だから、このような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は同じことを行うように見えます残りの部分は私が必要と思わない(削除、デタッチなど)。私の質問は次のとおりです: エラーを発生させずにユーザーオブジェクトに状態を追加するにはどうすればよいですか?
Stateオブジェクトをユーザーオブジェクトに追加する前に、それらを取得するにはどうすればよいですか? –
@AbassAそれぞれに対してgetStateById()を実行し、状態オブジェクトを配列リストに返し、setterメソッドを使用して配列リストをユーザーに追加します – Aria
保存メソッドを処理する完全なコードを提供できますか。なぜあなたはあなたのコレクション属性の上に@Columnを持っていますか?この必要はありません。そして、私は関係をサポートするテーブルuser_stateを持っていると思いますか? –