Hibernate OneToMany MySQLIntegrityConstraintViolationException:重复条目

时间:2015-08-19 14:48:44

标签: java mysql hibernate

我有两个java hibernate实体:

@Entity
public class Match_soccer extends Match{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int mid;

    ...

另一个:

@Entity
public class Algo {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @OneToMany
    private List<Match_soccer> matches = new ArrayList<Match_soccer>();

    ...

如果我尝试保存两个不同的Algo实体,但有一些matches列表,我会得到Duplicate entry '6028' for key 'UK_auyvi1qkpdtaqrpuyv9je5rda'例外。

Hibernate在数据库3表中创建:Algo Match_soccer和表:

Algo_Match_soccer
with columns:
Algo1_id    int(11)
matches_mid int(11) PK

我的目标是为Algo分配比赛列表。匹配可以是2个不同Algo对象中的一些。

Algo a1 = new Algo();
Algo a2 = new Algo();
SoccerDAO sd = new SoccerDAO();
List<Match_soccer> ms = sd.getMatches(DateFrom,DateTo); // Matches from database
a1.setMatches(ms);
a2.setMatches(ms);

我使用此功能插入:

public void insertAlgo(Algo1 a){

    try {           
        session.beginTransaction();
        session.save(a);
        session.getTransaction().commit();
    }
    catch (RuntimeException e) {
        session.getTransaction().rollback();
        session.clear();
        throw e;
}

2 个答案:

答案 0 :(得分:2)

  

匹配可以是两个不同的Algo对象中的一些

然后你没有OneToMany关联,而是ManyToMany关联。因为一个Algo有几场比赛,一场比赛属于几个algos。

更改映射,并相应地更改数据库架构:连接表的PK应该是ID对,而不仅仅是匹配ID。

答案 1 :(得分:1)

由于Match_soccer可能与许多Algo实体实例有关系,因此matches关联/集合必须为`@ 很多 ToMany。

如果您将关联保留为@OneToMany,它将为match_id定义UK // PK约束,该约束不允许您为两个不同的Algo实例设置相同的匹配