ERROR: Field 'scId' doesn't have a default value

来源:互联网 发布:交互设计要学编程吗 编辑:程序博客网 时间:2024/06/06 20:07

问题标签:
hibernate、@ManyToMany 、主键

抛出异常:
ERROR: Field ‘scId’ doesn’t have a default value

问题描述:
有Student,Subject,Score 三个实体类,表示学生、科目、分数,
其中Student与Subject采用ManyToMany关系,生成表score,
而Score实体类又分别与student和subject成ManyToMany关系,且有自己的主键scId。具体代码参考下文。
在往数据库中添加score时,抛出异常ERROR: Field 'scId' doesn't have a default value

问题原因
代码的原意是score表以自己的scId为主键,然而hibernate在生成score表时会以studentId和subjectId为主键 ,导致scId不能作为主键自动生成,因而抛出ERROR: Field 'scId' doesn't have a default value 异常。

解决办法:
手动建 score表,再执行程序。
建表SQL:

DROP DATABASE IF EXISTS hibernate;CREATE DATABASE hibernate;CREATE TABLE score(scId INT PRIMARY KEY AUTO_INCREMENT,stuId INT REFERENCES student(stuId),subId INT REFERENCES `subject`(subId),score INT);

源码
student.java

package demo1.model;import...@Entitypublic class Student {    @Id    @GeneratedValue    private int stuId;    private String stuName;    @ManyToMany(            targetEntity=Subject.class,            cascade={CascadeType.ALL}    )    @JoinTable(            name="score",            joinColumns=@JoinColumn(name="stuId",referencedColumnName="stuId"),            inverseJoinColumns=@JoinColumn(name="subId",referencedColumnName="subId")    )    private Set<Subject> subs;    //get() set()...}

subject.java

package demo1.model;import...@Entitypublic class Subject {    @Id    @GeneratedValue    private int subId;    private String subName;    @ManyToMany(                cascade = {CascadeType.ALL},            mappedBy = "subs",            targetEntity = Student.class    )    private Set<Student> stus;    //...get() set()}

scoreBean.java

package demo1.model;import...@Entity@Table(name="score")public class ScoreBean {    @Id    @GeneratedValue    private int scId;    private int score;    @ManyToOne(cascade={CascadeType.ALL})    @JoinColumn(name="stuId")    private Student student;    @ManyToOne(cascade={CascadeType.ALL})    @JoinColumn(name="subId")    private Subject subject;    //...get() set()}

测试代码(依次执行):

@Test    public void createSubjects(){        Session session = sf.getCurrentSession();        session.beginTransaction();        Subject sub1 = new Subject();        sub1.setSubName("Chinese");        Subject sub2 = new Subject();        sub2.setSubName("Math");        Subject sub3 = new Subject();        sub3.setSubName("English");        Subject sub4 = new Subject();        sub4.setSubName("Physics");        session.save(sub1);        session.save(sub2);        session.save(sub3);        session.save(sub4);        session.getTransaction().commit();    }    @Test    public void createStudents(){        Session session = sf.getCurrentSession();        session.beginTransaction();        for(int i =1;i<=5;i++){            Student stu1 = new Student();            stu1.setStuName("Jack"+i);            session.save(stu1);        }        session.getTransaction().commit();    }@Test    public void createScore(){        Session session = sf.getCurrentSession();        session.beginTransaction();        Student stu = (Student) session.get(Student.class, 1);        Subject sub = (Subject) session.get(Subject.class, 1);        ScoreBean sc = new ScoreBean();        sc.setScore(80);        sc.setStudent(stu);        sc.setSubject(sub);        session.save(stu);        session.save(sub);        session.save(sc);        session.getTransaction().commit();        sf.close();    }
0 0
原创粉丝点击