Java 休眠外键不工作,SSH

Java 休眠外键不工作,SSH,java,spring,hibernate,hibernate-mapping,Java,Spring,Hibernate,Hibernate Mapping,mysql中的3个表如下所示: CREATE TABLE tstudent( id varchar(36) primary key not null, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, grade int NOT NULL, sex VARCHAR(1) NOT NULL, birthday DATE, dayorboarding VARCHAR(1) N

mysql中的3个表如下所示:

CREATE TABLE tstudent(
  id varchar(36) primary key not null,
  firstname VARCHAR(30) NOT NULL,
  lastname VARCHAR(30)  NOT NULL,
  grade int   NOT NULL,
  sex VARCHAR(1)      NOT NULL,
  birthday DATE,
  dayorboarding VARCHAR(1)    NOT NULL,
  age int   ,
  house VARCHAR(20),
  mentor VARCHAR(50)
);


CREATE TABLE ttrip(
  id varchar(36) primary key not null,
  departureday       DATE         NOT NULL,
  name varchar(100) not null unique
);

CREATE TABLE tsignup(
  id varchar(36) primary key not null,
  s_id varchar(36) not null,
  FOREIGN KEY (s_id) REFERENCES tstudent(id), 
  t_id varchar(36) not null,
  FOREIGN KEY (t_id) REFERENCES ttrip(id),
  departuretransport   VARCHAR(1)   NOT NULL,
  returntransport    VARCHAR(1)   NOT NULL,
  remark TEXT
);
[org.hibernate.engine.jdbc.spi.SqlExceptionHelper]SQL Error: 1048, SQLState: 23000
[org.hibernate.engine.jdbc.spi.SqlExceptionHelper]Column 's_id' cannot be null
[org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl]HHH000010: On release of batch it still contained JDBC statements
t学生模型如下所示:

package cz.model;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Tstudent entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "tstudent", catalog = "rlcbau")
public class Tstudent implements java.io.Serializable {

    // Fields

    private String id;
    private String firstname;
    private String lastname;
    private Integer grade;
    private String sex;
    private Date birthday;
    private String dayorboarding;
    private Integer age;
    private String house;
    private String mentor;
    private Set<Tsignup> tsignups = new HashSet<Tsignup>(0);

    // Constructors

    /** default constructor */
    public Tstudent() {
    }

    /** minimal constructor */
    public Tstudent(String id, String firstname, String lastname, Integer grade, String sex, String dayorboarding) {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.grade = grade;
        this.sex = sex;
        this.dayorboarding = dayorboarding;
    }

    /** full constructor */
    public Tstudent(String id, String firstname, String lastname, Integer grade, String sex, Date birthday, String dayorboarding, Integer age, String house, String mentor, Set<Tsignup> tsignups) {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.grade = grade;
        this.sex = sex;
        this.birthday = birthday;
        this.dayorboarding = dayorboarding;
        this.age = age;
        this.house = house;
        this.mentor = mentor;
        this.tsignups = tsignups;
    }

    // Property accessors
    @Id
    @Column(name = "id", unique = true, nullable = false, length = 36)
    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Column(name = "firstname", nullable = false, length = 30)
    public String getFirstname() {
        return this.firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    @Column(name = "lastname", nullable = false, length = 30)
    public String getLastname() {
        return this.lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    @Column(name = "grade", nullable = false)
    public Integer getGrade() {
        return this.grade;
    }

    public void setGrade(Integer grade) {
        this.grade = grade;
    }

    @Column(name = "sex", nullable = false, length = 1)
    public String getSex() {
        return this.sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "birthday", length = 10)
    public Date getBirthday() {
        return this.birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Column(name = "dayorboarding", nullable = false, length = 1)
    public String getDayorboarding() {
        return this.dayorboarding;
    }

    public void setDayorboarding(String dayorboarding) {
        this.dayorboarding = dayorboarding;
    }

    @Column(name = "age")
    public Integer getAge() {
        return this.age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Column(name = "house", length = 20)
    public String getHouse() {
        return this.house;
    }

    public void setHouse(String house) {
        this.house = house;
    }

    @Column(name = "mentor", length = 50)
    public String getMentor() {
        return this.mentor;
    }

    public void setMentor(String mentor) {
        this.mentor = mentor;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "tstudent")
    public Set<Tsignup> getTsignups() {
        return this.tsignups;
    }

    public void setTsignups(Set<Tsignup> tsignups) {
        this.tsignups = tsignups;
    }

}
package cz.model;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;

/**
 * Ttrip entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "ttrip", catalog = "rlcbau", uniqueConstraints = @UniqueConstraint(columnNames = "name"))
public class Ttrip implements java.io.Serializable {

    // Fields

    private String id;
    private String departureday;
    private String name;
    private Set<Tsignup> tsignups = new HashSet<Tsignup>(0);

    // Constructors

    /** default constructor */
    public Ttrip() {
    }

    /** minimal constructor */
    public Ttrip(String id, String departureday, String name) {
        this.id = id;
        this.departureday = departureday;
        this.name = name;
    }

    /** full constructor */
    public Ttrip(String id, String departureday, String name, Set<Tsignup> tsignups) {
        this.id = id;
        this.departureday = departureday;
        this.name = name;
        this.tsignups = tsignups;
    }

    // Property accessors
    @Id
    @Column(name = "id", unique = true, nullable = false, length = 36)
    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }


    @Column(name = "departureday", nullable = false, length = 10)
    public String getDepartureday() {
        return this.departureday;
    }

    public void setDepartureday(String departureday) {
        this.departureday = departureday;
    }

    @Column(name = "name", unique = true, nullable = false, length = 100)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "ttrip")
    public Set<Tsignup> getTsignups() {
        return this.tsignups;
    }

    public void setTsignups(Set<Tsignup> tsignups) {
        this.tsignups = tsignups;
    }

}
    public void save_stulst(){
        Json j = new Json();
        try {
//          logger.info(signup.getId()+signup.getS_id()+signup.getT_id()+signup.getRemark()+signup.getDeparturetransport()+signup.getReturntransport());
            signupService.save_stulst(signup);
            j.setSuccess(true);
            j.setMsg("Signup succeeds!");

        } catch (Exception e) {
            j.setMsg(e.getMessage());
        }
        super.writeJson(j);
    }
我的注册活动如下:

package cz.model;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Tstudent entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "tstudent", catalog = "rlcbau")
public class Tstudent implements java.io.Serializable {

    // Fields

    private String id;
    private String firstname;
    private String lastname;
    private Integer grade;
    private String sex;
    private Date birthday;
    private String dayorboarding;
    private Integer age;
    private String house;
    private String mentor;
    private Set<Tsignup> tsignups = new HashSet<Tsignup>(0);

    // Constructors

    /** default constructor */
    public Tstudent() {
    }

    /** minimal constructor */
    public Tstudent(String id, String firstname, String lastname, Integer grade, String sex, String dayorboarding) {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.grade = grade;
        this.sex = sex;
        this.dayorboarding = dayorboarding;
    }

    /** full constructor */
    public Tstudent(String id, String firstname, String lastname, Integer grade, String sex, Date birthday, String dayorboarding, Integer age, String house, String mentor, Set<Tsignup> tsignups) {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.grade = grade;
        this.sex = sex;
        this.birthday = birthday;
        this.dayorboarding = dayorboarding;
        this.age = age;
        this.house = house;
        this.mentor = mentor;
        this.tsignups = tsignups;
    }

    // Property accessors
    @Id
    @Column(name = "id", unique = true, nullable = false, length = 36)
    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Column(name = "firstname", nullable = false, length = 30)
    public String getFirstname() {
        return this.firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    @Column(name = "lastname", nullable = false, length = 30)
    public String getLastname() {
        return this.lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    @Column(name = "grade", nullable = false)
    public Integer getGrade() {
        return this.grade;
    }

    public void setGrade(Integer grade) {
        this.grade = grade;
    }

    @Column(name = "sex", nullable = false, length = 1)
    public String getSex() {
        return this.sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "birthday", length = 10)
    public Date getBirthday() {
        return this.birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Column(name = "dayorboarding", nullable = false, length = 1)
    public String getDayorboarding() {
        return this.dayorboarding;
    }

    public void setDayorboarding(String dayorboarding) {
        this.dayorboarding = dayorboarding;
    }

    @Column(name = "age")
    public Integer getAge() {
        return this.age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Column(name = "house", length = 20)
    public String getHouse() {
        return this.house;
    }

    public void setHouse(String house) {
        this.house = house;
    }

    @Column(name = "mentor", length = 50)
    public String getMentor() {
        return this.mentor;
    }

    public void setMentor(String mentor) {
        this.mentor = mentor;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "tstudent")
    public Set<Tsignup> getTsignups() {
        return this.tsignups;
    }

    public void setTsignups(Set<Tsignup> tsignups) {
        this.tsignups = tsignups;
    }

}
package cz.model;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;

/**
 * Ttrip entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "ttrip", catalog = "rlcbau", uniqueConstraints = @UniqueConstraint(columnNames = "name"))
public class Ttrip implements java.io.Serializable {

    // Fields

    private String id;
    private String departureday;
    private String name;
    private Set<Tsignup> tsignups = new HashSet<Tsignup>(0);

    // Constructors

    /** default constructor */
    public Ttrip() {
    }

    /** minimal constructor */
    public Ttrip(String id, String departureday, String name) {
        this.id = id;
        this.departureday = departureday;
        this.name = name;
    }

    /** full constructor */
    public Ttrip(String id, String departureday, String name, Set<Tsignup> tsignups) {
        this.id = id;
        this.departureday = departureday;
        this.name = name;
        this.tsignups = tsignups;
    }

    // Property accessors
    @Id
    @Column(name = "id", unique = true, nullable = false, length = 36)
    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }


    @Column(name = "departureday", nullable = false, length = 10)
    public String getDepartureday() {
        return this.departureday;
    }

    public void setDepartureday(String departureday) {
        this.departureday = departureday;
    }

    @Column(name = "name", unique = true, nullable = false, length = 100)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "ttrip")
    public Set<Tsignup> getTsignups() {
        return this.tsignups;
    }

    public void setTsignups(Set<Tsignup> tsignups) {
        this.tsignups = tsignups;
    }

}
    public void save_stulst(){
        Json j = new Json();
        try {
//          logger.info(signup.getId()+signup.getS_id()+signup.getT_id()+signup.getRemark()+signup.getDeparturetransport()+signup.getReturntransport());
            signupService.save_stulst(signup);
            j.setSuccess(true);
            j.setMsg("Signup succeeds!");

        } catch (Exception e) {
            j.setMsg(e.getMessage());
        }
        super.writeJson(j);
    }
在服务级别,我有signupService:

@Service(value="signupService")
public class SignupServiceImpl implements SignupServiceI {

    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(StudentServiceImpl.class);


    private BaseDaoI<Tsignup> signupDao;
    private BaseDaoI<Tstudent> studentDao;
    private BaseDaoI<Ttrip> tripDao;


    public BaseDaoI<Tsignup> getSignupDao() {
        return signupDao;
    }

    @Autowired
    public void setSignupDao(BaseDaoI<Tsignup> signupDao) {
        this.signupDao = signupDao;
    }

    public BaseDaoI<Ttrip> getTripDao() {
        return tripDao;
    }

    @Autowired
    public void setTripDao(BaseDaoI<Ttrip> tripDao) {
        this.tripDao = tripDao;
    }

    public BaseDaoI<Tstudent> getStudentDao() {
        return studentDao;
    }

    @Autowired
    public void setStudentDao(BaseDaoI<Tstudent> studentDao) {
        this.studentDao = studentDao;
    }

    @Override
    public void save_stulst(Signup signup) {

        Tsignup tsignup = new Tsignup();
        Tstudent tstudent = studentDao.get(Tstudent.class, signup.getS_id());
        Ttrip ttrip = tripDao.get(Ttrip.class, signup.getT_id());


        BeanUtils.copyProperties(signup, tsignup, new String[]{"id"});
        tsignup.setId(UUID.randomUUID().toString());
        tsignup.setTstudent(tstudent);
        tsignup.setTtrip(ttrip);


        signupDao.save(tsignup);
    }

我刚开始冬眠,不知道哪一步错了。我已经把ttrip和tstudent加入到了tsignup模型中。。它应该已经保存了

那么您对tsignup表的定义清楚地显示了对s_id列的NOTNULL约束。你真的需要这个吗? 如果没有,请将其移除,这样应该可以正常工作

干杯 Anant更改您的tsignup表格


是的,我需要它,因为它不是空的。你的save_stulst API应该有一个注册对象,然后填充相应的学生对象!对不起大家,我的错。我把价值观搞砸了如果我的回答有帮助,我想知道你是否可以投同样的票。将有助于改善我的个人资料,我需要此为非空。按照您的建议更改了表,但它给了我:s_idi中的NULL值如果您真的需要该列不为NULL,那么您也必须向该列传递一个值。对不起,各位,我的错。我把价值观搞砸了
  CREATE TABLE tsignup(
  ...
  s_id VARCHAR(36) NULL,
  ...