我正在尝试理解为什么在保留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
实体,可以是Tournament
或Match
(不是两者)。在创建Match
或Thethread
时,我从数据库加载了不同的Teams
,我可以选择参与哪些团队。比如比赛将有2支球队,比赛将有包含在组中的球队(组a,b,c等)。我在这两者之间看到的唯一区别是,一个关系是@ManyToMany
,另一个关系是@ManyToOne
。一支球队有很多比赛,但一场比赛只有一支球队A(和一支球队B)。 tournament
有很多Groups
,group
有很多teams
,team
有很多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);
评论的部分是我试图让团队得到管理,但它没有用。
如果有人读到这里,我有两个问题:
我正在使用EclipseLink 2.6
答案 0 :(得分:0)
我创建了另一个实体来代表manytomany协会之间的表。错误消失但我改变了很多东西,所以我无法保证它解决了这个问题。至于为什么会发生这种情况,我认为这是因为团队存在于团队表中,但尚未出现在表格中,从而形成了多人关系。