mysql - JPA,已经持久化的对象给出 "a new object was found through a relationship that was not marked cascade PERSIST"

标签 mysql jpa orm many-to-many eclipselink

我试图理解为什么在保留锦标赛时会出现错误,但在保留比赛时却不会出现错误。

错误:

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 都没有使用 cascade persist 注释的 team 实体。然而匹配仍然持续,没有错误。

它的工作原理如下:我可以创建 Thethread 实体,它可以是 TournamentMatch (不能同时是两者)。创建 MatchThethread 时,我从数据库加载不同的Teams,并且可以选择哪个团队参与什么。例如,一场比赛将有 2 支球队,而一场锦标赛将有包含在小组中的球队(a、b、c 组等)。我发现这两者之间的唯一区别是,一种关系是 @ManyToMany,另一种关系是 @ManyToOne。一支球队有很多场比赛,但一场比赛只有一个 teamA(和一个 teamB)。一场锦标赛有许多,一个有许多团队,一个团队有许多。 请注意,在这两种情况下,团队都没有 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;
}

比赛组别:

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

当持久化到数据库时,我这样做:

    @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

最佳答案

我创建了另一个实体来表示多对多关联之间的表。错误消失了,但我改变了很多东西,所以我不能保证它解决了问题。至于为什么会出现这种情况,我认为是因为团队存在于团队表中,但尚未在表中进行多对多关联。

关于mysql - JPA,已经持久化的对象给出 "a new object was found through a relationship that was not marked cascade PERSIST",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33747458/

相关文章:

java - JPA 和公历

mysql - 当行不存在时显示计数值 0 MYSQL

Mysql:intvalue ='1' 和 intvalue=1 之间的区别

java - JPA CascadeType.REFRESH 不工作?

java - JPA 一对一关系的级联操作

java - JPA 实体中的预加载/加载后更新

PHP: Controller 中的 Symfony2 MySQL SELECT 查询

mysql - 我需要为新语言准备一个新表吗?

sql - 用于加入子查询的 JPA CriteriaBuilder

linq-to-sql - 现在已经发布Entity Framework 4.0了吗?转储Linq-To-Sql吗?