Hibernate annotation ManyToMany的中间表加入自己的字段存储报错

lg_asus 2011-11-19 07:13:58
Student单向ManyToMany Course, 中间表是Score, 其中Score单向ManyToMany Student和Course,Score中用studentId和courseId作为联合主键,同时还有自己的字段score成绩(nullable=true)。在保存时:new 一个Student、Course、Score, 设置好关系后,Score.setScore(90) 设置成绩分数,结果执行两次insert into score,duplicate entry for primary key.


@Entity
@Table(name="t_student")
public class Student {

private int id;
private String name;
private Set<Course> courses = new HashSet<Course>();
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany
@JoinTable(name="t_score",joinColumns={@JoinColumn(name="studentId")},inverseJoinColumns={@JoinColumn(name="courseId")})
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}

}

@Entity
@Table(name="t_course")
public class Course {

private int id;
private String name;
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


@Entity
@Table(name="t_score")
@IdClass(ScorePK.class)
public class Score {
private int score;
private Student student;
private Course course;
@Column(nullable=true)
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Id
@ManyToOne
@JoinColumn(name="studentId")
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Id
@ManyToOne
@JoinColumn(name="courseId")
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}

}


@Entity
public class ScorePK implements java.io.Serializable{
private Student student;
private Course course;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}

@Override
public boolean equals(Object o){
if(o instanceof ScorePK){
ScorePK t = (ScorePK) o;
return t.getStudent() == this.getStudent()
&& t.getCourse()==this.getCourse();
}
return false;
}

@Override
public int hashCode(){
return this.student.hashCode();
}
}


...全文
705 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuehaiwuyaya 2012-04-19
  • 打赏
  • 举报
回复
还是没人解决?再顶
xuehaiwuyaya 2012-04-19
  • 打赏
  • 举报
回复
我也遇到了相同的问题,求解决啊
lg_asus 2011-11-19
  • 打赏
  • 举报
回复

session.beginTransaction();
Course c = new Course();
c.setId(21);
c.setName("English");

Student s = new Student();
s.setId(11);
s.setName("Hiway");
s.getCourses().add(c);

Score sc = new Score();
sc.setScore(90);
sc.setStudent(s);
sc.setCourse(c);

session.save(c);
session.save(s);
session.save(sc);

session.getTransaction().commit();
lg_asus 2011-11-19
  • 打赏
  • 举报
回复

session.beginTransaction();
Course c = new Course();
c.setId(21);
c.setName("English");

Student s = new Student();
s.setId(11);
s.setName("Hiway");
s.getCourses().add(c);

Score sc = new Score();
sc.setScore(90);
sc.setStudent(s);
sc.setCourse(c);

session.save(c);
session.save(s);
session.save(sc);

session.getTransaction().commit();
这是测试代码
lg_asus 2011-11-19
  • 打赏
  • 举报
回复

session.beginTransaction();
Course c = new Course();
c.setId(21);
c.setName("English");

Student s = new Student();
s.setId(11);
s.setName("Hiway");
s.getCourses().add(c);

Score sc = new Score();
sc.setScore(90);
sc.setStudent(s);
sc.setCourse(c);

session.save(c);
session.save(s);
session.save(sc);

session.getTransaction().commit();

显示的sql中:
执行两次insert into t_score
Hibernate:
insert
into
t_score
(score, courseId, studentId)
values
(?, ?, ?)
Hibernate:
insert
into
t_score
(studentId, courseId)
values
(?, ?)
显然是有问题的。
如果session.save(sc) 注释掉的话,则只执行一次insert into score,但那个分数没插进去。

请问如何解决?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧