Hibernate 已关联具有相同标识符值的不同对象
在我的Java项目中,我有以下三个类和一个代码来插入数据: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
@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<>();
}