web-dev-qa-db-ja.com

JPAを使用してオブジェクト内のコレクション/リストを永続化する方法

オブジェクトチーム内でリストを永続化しようとしています。 JPAにそれを永続化させることはできません。いくつかの投稿を読んだ後、リスト<>を繰り返し処理し、それぞれを個別に永続化する必要があるようです。これは私には正しくないようです。 JPAがそのリストを自動的に永続化する方法が必要です。

これらのオブジェクトを深く永続化する簡単なJPAの方法がありませんか?

チームクラス:

@Entity
@Table(name = "rahCLUB_TEAM")
public class Team implements Serializable{
....
@OneToMany(fetch=FetchType.EAGER, mappedBy = "team", cascade={CascadeType.PERSIST,  CascadeType.REMOVE})
    private List<Player> players;
...
}

プレイヤークラス:

@Entity
@PrimaryKeyJoinColumn(name="id")
@Table(name = "rahCLUB_PLAYER")

public class Player extends Individual implements Serializable{
 ...
   @ManyToOne
   @JoinTable(name="rahCLUB_PLAYER_TEAM_LINK")
   private Team team;
 ...
 }

JPAClubDAOTest:

//create a valid team code
 ...
 Team team = new Team();
 team.setName("Pittsburgh Pirates");
 team.setLeague("NFL");
 team.setGroup("group");
 team.setLevel("AAA");

 Player player = new Player();
 player.setFirstName("firstNameA");
 player.setLastName("lastNameA");
 player.setEmail("[email protected]");
 player.setLogin("loginA");
 player.setJerseyNo(22);
 player.setPosition("fullback");
 Date dob  =new SimpleDateFormat("dd/MM/yyyy").parse("21/11/1986");
 player.setDob(dob);

 Player playerb = new Player();
 playerb.setFirstName("firstNameB");
 playerb.setLastName("lastNameB");
 playerb.setEmail("[email protected]");
 playerb.setLogin("loginB");
 playerb.setJerseyNo(15);
 playerb.setPosition("widereceiver");
 Date dobb  =new SimpleDateFormat("dd/MM/yyyy").parse("06/06/1986");
 playerb.setDob(dobb);

 ArrayList<Player> players = new ArrayList<Player>();
 players.add(player);
 players.add(playerb);

 team.setPlayers(players);

 Team queryTeam = em.find(Team.class, team.getId());
 log.debug("checking coach...");

これらはすべて失敗します:

assertTrue(queryTeam.getPlayers().size()>0);
assertNotNull(queryTeam.getPlayers().get(0));
assertTrue(queryTeam.getPlayers().size()==2);

これを追加するコード:

@Override
public void createTeam(Team team) throws ClubDAOException {
em.persist(team);
for (Player player : team.getPlayers())
{
   this.createPlayer(player);
   //em.persist(player);
}
7
technocrat

さて、ここで見たいので、私自身の質問に答えるつもりです...

JB Nizetが私のためにこれを解決し、正しい投稿を示してくれたことを称賛します: アノテーションとJPA(hibernate)を理解する

重要なのは、逆の関係を設定する必要があるということです。上記の例では、それを修正するには:

player.setTeam(team);
playerb.setTeam(team);

関係の両側が設定されると、それはデータベースに永続化されます。

3
technocrat

別のアプローチを使用できます。

単方向OneToMany: http://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Unidirection_OneToMany.2C_No_Inverse_ManyToOne.2C_No_Join_Table_.28JPA_2.0_ONLY.29

それでも、オブジェクトを永続化してからコレクションに追加する必要があります。

3
r1ckr