QMCoder 2017-03-13 08:41 采纳率: 33.3%
浏览 3510

Hibernate注解主键生成策略问题

学生
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就不会级联保存(学生方配置级联保存),就会报上面的错

  • 写回答

2条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复