Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 已关联具有相同标识符值的不同对象_Hibernate_Jpa - Fatal编程技术网

Hibernate 已关联具有相同标识符值的不同对象

Hibernate 已关联具有相同标识符值的不同对象,hibernate,jpa,Hibernate,Jpa,在我的Java项目中,我有以下三个类和一个代码来插入数据: @Entity(name = "Quiz") @Table(name = "quiz") public class Quiz implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private L

在我的Java项目中,我有以下三个类和一个代码来插入数据:

@Entity(name = "Quiz")
@Table(name = "quiz")
public class Quiz implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne(cascade= CascadeType.ALL)
    private Skill skill;

    @ManyToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    private List<StudentClass> stClasses= new ArrayList<>();


@Entity
public class Skill implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;


@Entity
@Table(name = "Student_Class")
@PrimaryKeyJoinColumn(name="id")
public class StudentClass implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @OneToMany(fetch= FetchType.EAGER, cascade = { CascadeType.ALL })
    @JoinColumn(name = "stClass_id", referencedColumnName="id")
    private Set<User> students=new HashSet<>();

    @ManyToMany(fetch= FetchType.EAGER, mappedBy="stClasses", cascade=CascadeType.ALL)
    private Set<Quiz> quizzes= new HashSet<>();

@Transactional
public void save(Quiz quiz) {
    hibernateTemplate.saveOrUpdate(quiz);
}
例如:

quiz.setName("what the capital...");
quiz.setSkill("geography");
quiz.addstClass("formation Java");

quiz.setName("what the money...");
quiz.setSkill("geography");
quiz.addstClass("formation Java");
我有一个错误,因为StudentClass已经在使用技能!如果我换学生班,我没有问题

不知道怎么会出问题!有人有主意吗


非常感谢你

您的问题是,由于
级联.ALL
注释,当您尝试使用
saveAndUpdate
persist
时,这命令Hibernate尝试插入一个新实体,在您的情况下,该实体已经存在。因此,您不需要使用这些方法中的一种,而是需要合并您的实体,该实体将首先检查它是否存在,然后尝试插入,否则它将简单地执行并更新

因此,您需要进行以下更改

@Entity(name = "Quiz")
@Table(name = "quiz")
public class Quiz implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne(cascade= CascadeType.MERGE)
    private Skill skill;

    @ManyToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    private List<StudentClass> stClasses= new ArrayList<>();
}
@Entity(name=“quick”)
@表(name=“测验”)
公共类测验实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名称;
@manytone(cascade=CascadeType.MERGE)
个人技能;
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private List stClasses=new ArrayList();
}

在存储库中,您需要使用
merge(entity)
。希望这有帮助

使用hibernateTemplate.execute(测验)可能会有帮助;在hibernateTemplate.saveOrUpdate(测验)之前;
@Entity(name = "Quiz")
@Table(name = "quiz")
public class Quiz implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne(cascade= CascadeType.MERGE)
    private Skill skill;

    @ManyToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    private List<StudentClass> stClasses= new ArrayList<>();
}