を永続化するときにエラーが発生する理由を理解しようとしていますが、を永続化するときにエラーが発生するTournament
わけではありませんMatch
。
エラー:
Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: main.java.entities.Team@3eff51aa.
エンティティに。の注釈が付けられていませMatch
ん。それでも、一致はエラーなしで持続しています。Tournament
team
cascade persist
それで、これがどのように機能するかです:私はThethread
aTournament
またはa Match
(両方ではない)のいずれかであることができるエンティティを作成することができます。作成するとき、Match
またはデータベースとThethread
は異なるものをロードするときにTeams
、どのチームが何に参加するかを選択できます。マッチなどには2つのチームがあり、トーナメントにはグループ(グループa、b、cなど)に含まれるチームがあります。これら2つの間に見られる唯一の違いは、一方の関係がで@ManyToMany
あり、もう一方の関係がであるということです@ManyToOne
。チームには多くの試合がありますが、試合には1つのteamA(および1つのteamB)しかありません。Aにtournament
はたくさんGroups
あり、aにgroup
はたくさんありteams
、aにteam
はたくさんありますgroups
。どちらの場合も、チームにはCascadeType.Persistがないことに注意してください(DBから取得しているため、これは必要ありません。永続化すると重複が発生します)。
糸
public class Thethread implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="idthread")
private long idthread;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "categories_idcategory")
private Category category;
@OneToOne(mappedBy = "thread", cascade = CascadeType.PERSIST)
private Match match;
@OneToOne(mappedBy="thread", cascade = CascadeType.PERSIST)
private Tournament tournie;
一致
public class Match implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_match")
private long idmatch;
@OneToOne
@JoinColumn(name = "idthread")
private Thethread thread;
@NotNull
@ManyToOne
@JoinColumn(name = "team_a")
private Team teamA;
@NotNull
@ManyToOne
@JoinColumn(name = "team_b")
private Team teamB;
トーナメント
@Entity
@Table(name="layout_tournament")
public class Tournament implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="idlayout_tournament")
private int idtournie;
@OneToMany(mappedBy="tournie", cascade = CascadeType.PERSIST)
private List<TournamentGroup> groups;
@OneToOne
@JoinColumn(name="thread")
private Thethread thread;
}
TournamentGroup:
public class TournamentGroup implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="idtournie_group")
private int idgroup;
@ManyToOne
@JoinColumn(name="tournie")
private Tournament tournie;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="team_has_tournie_group",
joinColumns=
@JoinColumn(name="tournie_group"),
inverseJoinColumns=
@JoinColumn(name="team"))
private List<Team> teams;
}
DBに固執するとき、私は次のようにします。
@Override
public void updateLatestThreadCategory(long id, Thethread latestThread) {
// Query query = em.createQuery(JPQL_FIND_BY_ID, Category.class);
// query.setParameter("id", id);
// if(null != latestThread.getTournie()){
// if(null != latestThread.getTournie().getGroups()){
// for (TournamentGroup g : latestThread.getTournie().getGroups()){
// for(Team t : g.getTeams()){
// t = em.getReference(Team.class, t.getIdteams());
// }
// }
// }
// }
em.persist(latestThread);
Category cat = em.getReference(Category.class, id);
cat.setlastThread(latestThread);
コメントされた部分は、私がチームを管理させようとしているのですが、うまくいきませんでした。
したがって、誰かがここまで読んだ場合、2つの質問があります。
EclipseLink2.6を使用しています
多対多の関連付けの間にあるテーブルを表す別のエンティティを作成しました。エラーはなくなりましたが、多くの変更を加えたため、問題が解決したことを保証できません。これが発生する理由については、チームがチームテーブルに存在しているが、多対多の関連付けを行っているテーブルにはまだ存在していないためだと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加