JPA,已经持久化的对象给出了“通过未标记为级联PERSIST的关系找到了一个新对象”

时间:2015-11-17 01:03:50

标签: mysql jpa orm many-to-many eclipselink

我正在尝试理解为什么在保留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.

MatchTournament都没有team实体注释cascade persist。然而,比赛仍然没有错误。

以下是它的工作原理:我可以创建Thethread实体,可以是TournamentMatch(不是两者)。在创建MatchThethread时,我从数据库加载了不同的Teams,我可以选择参与哪些团队。比如比赛将有2支球队,比赛将有包含在组中的球队(组a,b,c等)。我在这两者之间看到的唯一区别是,一个关系是@ManyToMany,另一个关系是@ManyToOne。一支球队有很多比赛,但一场比赛只有一支球队A(和一支球队B)。 tournament有很多Groupsgroup有很多teamsteam有很多groups。 请注意,在这两种情况下,团队都没有CascadeType.Persist(我不想要,因为我从数据库中取出它们,坚持这些会产生重复)。

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);

评论的部分是我试图让团队得到管理,但它没有用。

如果有人读到这里,我有两个问题:

  • 为什么我可以坚持一个包含匹配的线程而没有问题,但我对包含锦标赛的线程有错误。(请注意,这些团队都来自数据库,但在这两种情况下,我认为不是管理)?
  • 当我坚持一场有teamA和teamB的比赛时:JPA是否只是在比赛表中写下一支球队的ID,或者是否也更新了球队?因此,如果有人决定创建匹配,他首先请求出现在下拉列表中的团队。在此期间,如果团队的所有者决定编辑他的团队并在数据库中更新它。然后创建一个匹配,与未经编辑的团队一起,编辑将被覆盖吗?

我正在使用EclipseLink 2.6

1 个答案:

答案 0 :(得分:0)

我创建了另一个实体来代表manytomany协会之间的表。错误消失但我改变了很多东西,所以我无法保证它解决了这个问题。至于为什么会发生这种情况,我认为这是因为团队存在于团队表中,但尚未出现在表格中,从而形成了多人关系。