JPA、すでに永続化されたオブジェクトは、「カスケードPERSISTとマークされていない関係を通じて新しいオブジェクトが見つかりました」と表示します。

Ced

を永続化するときにエラーが発生する理由を理解しようとしていますが、を永続化するときにエラーが発生する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それでも、一致はエラーなしで持続しています。Tournamentteamcascade persist

それで、これがどのように機能するかです:私はThethreadaTournamentまたは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つの質問があります。

  • 試合を含むスレッドを問題なく永続化できるのに、トーナメントを含むスレッドでエラーが発生するのはなぜですか(チームはDBから取得されますが、どちらの場合も管理されていないと思います)?
  • teamAとteamBを含む試合を永続化する場合:JPAは単に試合テーブルにチームのIDを書き込むのですか、それともチームを更新するのですか?したがって、誰かが試合を作成することを決定した場合、彼は最初にドロップダウンリストに表示されるチームを要求します。その間に、チームの所有者が自分のチームを編集してDBで更新することにした場合。次に、編集されていないチームとの試合が作成され、編集は上書きされますか?

EclipseLink2.6を使用しています

Ced

多対多の関連付けの間にあるテーブルを表す別のエンティティを作成しました。エラーはなくなりましたが、多くの変更を加えたため、問題が解決したことを保証できません。これが発生する理由については、チームがチームテーブルに存在しているが、多対多の関連付けを行っているテーブルにはまだ存在していないためだと思います。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ