学生
package hx.nan.entity;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
@Entity
@Table(name = "student")
public class Student {
private int id;
private String name;
private int age;
private Grade grade;
public Student() {
}
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Id
@GenericGenerator(name = "id",strategy = "assigned")
@GeneratedValue(generator = "id")
@Column(name = "id", nullable = false)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Basic
@Column(name = "name", nullable = false, length = 255)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Basic
@Column(name = "age", nullable = false)
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@ManyToOne(fetch = FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
@JoinColumn(name = "grade_id",referencedColumnName = "id")
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
package hx.nan.entity;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
年级
@Entity
@Table(name = "grade")
public class Grade {
private int id;
private String gradeNumber;
private Set<Student> students = new HashSet<>();
public Grade() {
}
public Grade(int id, String gradeNumber) {
this.id = id;
this.gradeNumber = gradeNumber;
}
@Id
@GenericGenerator(name = "id",strategy = "assigned")
@GeneratedValue(generator = "id")
@Column(name = "id", nullable = false)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Basic
@Column(name = "grade_number", nullable = false, length = 255)
public String getGradeNumber() {
return gradeNumber;
}
public void setGradeNumber(String gradeNumber) {
this.gradeNumber = gradeNumber;
}
@OneToMany(mappedBy = "grade")
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
测试代码
package hx.nan;
import hx.nan.entity.Grade;
import hx.nan.entity.Student;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
public class AnnotationTestTest {
@Test
public void testTestManyToOne() throws Exception {
Student s1 = new Student(1,"zhangsan",20);
Student s2 = new Student(2, "lisi", 30);
Grade grade = new Grade(1, "1班");
s1.setGrade(grade);
s2.setGrade(grade);
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
session.save(s1);
session.save(s2);
tx.commit();
session.close();
HibernateSessionFactory.closeSessionFactory();
}
}
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (hib
.student
, CONSTRAINT FK4xvaqcll34afqdd9vkydid5qo
FOREIGN KEY (grade_id
) REFERENCES grade
(id
))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:932)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
... 45 more
只有在生成策略为assigned时报错,在将一方的生成策略删除后就能正常执行,而且在年级一方也不能配置@GeneratedValue 配置后报同样的错(多方配置不出错),但是如果将上面代码的生成策略改为uuid(id类型改为String)后代码正常运行(两边都可以配置),到底是哪的问题,assigned不是由程序赋值吗?明显赋值了,但是年级方一旦配置assigned就不会级联保存(学生方配置级联保存),就会报上面的错