java - HIbernate 子对象不保存

标签 java mysql hibernate

我有一个 Employee 和 Employee Dept 表。一个员工可以有多个部门。

我已经在 MySQL 中定义了表并使用 JPA 生成了实体。

package model;

import java.io.Serializable;
import javax.persistence.*;
import java.util.List;


/**
 * The persistent class for the emp1000 database table.
 * 
 */
@Entity
@NamedQuery(name="Emp1000.findAll", query="SELECT e FROM Emp1000 e")
public class Emp1000 implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private String firstName;

    private String lastName;

    //bi-directional many-to-one association to EmpDept
    @OneToMany(mappedBy="emp1000")
    private List<EmpDept> empDepts;

    public Emp1000() {
    }

    public int getId() {
        return this.id;
    }

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

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<EmpDept> getEmpDepts() {
        return this.empDepts;
    }

    public void setEmpDepts(List<EmpDept> empDepts) {
        this.empDepts = empDepts;
    }

    public EmpDept addEmpDept(EmpDept empDept) {
        getEmpDepts().add(empDept);
        empDept.setEmp1000(this);

        return empDept;
    }

    public EmpDept removeEmpDept(EmpDept empDept) {
        getEmpDepts().remove(empDept);
        empDept.setEmp1000(null);

        return empDept;
    }

}



@Entity
@Table(name="emp_dept")
@NamedQuery(name="EmpDept.findAll", query="SELECT e FROM EmpDept e")
public class EmpDept implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(name="emp_dept")
    private String empDept;

    //bi-directional many-to-one association to Emp1000
    @ManyToOne
    @JoinColumn(name="emp_id")
    private Emp1000 emp1000;

    public EmpDept() {
    }

    public int getId() {
        return this.id;
    }

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

    public String getEmpDept() {
        return this.empDept;
    }

    public void setEmpDept(String empDept) {
        this.empDept = empDept;
    }

    public Emp1000 getEmp1000() {
        return this.emp1000;
    }

    public void setEmp1000(Emp1000 emp1000) {
        this.emp1000 = emp1000;
    }

}

当我尝试生成以创建一个 Employee 对象和关联的部门对象并将其保存到数据库时,子表永远不会被保存。

public class StoreData {
    public static void main(String[] args) {
        Session session=new AnnotationConfiguration()  
        .configure().buildSessionFactory().openSession();  

        //creating transaction object  
        Transaction t=session.beginTransaction();  


        Emp1000 e1 = new Emp1000();
        e1.setFirstName("Prem");
        e1.setLastName("Anand");

        EmpDept d1 = new EmpDept();
        d1.setEmpDept("Maths");
        d1.setEmp1000(e1);

        EmpDept d2 = new EmpDept();
        d1.setEmpDept("Science");
        d1.setEmp1000(e1);

        ArrayList<EmpDept> deptlist = new ArrayList();
        deptlist.add(d1);
        deptlist.add(d2);


        e1.setEmpDepts(deptlist);

        //session.saveOrUpdate(e1);

        session.persist(e1);//persisting the object  


        t.commit();//transaction is committed  

        session.close();  

        System.out.println("successfully saved");  


    }

    }

在表中创建了 Employee 对象,但没有创建 Employee dept 对象。我需要更改哪些设置?

添加后出现新错误 - @OneToMany(mappedBy="emp1000", cascade = CascadeType.ALL)

Feb 25, 2015 8:43:43 AM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Field 'id' doesn't have a default value
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [model.EmpDept]
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)

最佳答案

您需要将持久化操作级联到子实体。将 empDept 映射更改为

@OneToMany(mappedBy="emp1000", cascade = CascadeType.ALL)

关于java - HIbernate 子对象不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28720498/

相关文章:

php - 防止显示名称重复或重新输入名称

基于 CURDATE 的明天日期的 MySQL COUNT

hibernate - 使用 Hibernate Criteria 和 DISTINCT_ROOT_ENTITY 进行分页

java - 使用 Java 代码设置 Hibernate 映射值

java - Lombok 注释处理程序类 lombok.javac.handlers.HandleData 失败

Java:获取泛型类的 Class<T> 对象

java - 在对象数组中查找属性的最大值

java - Maven:MojoExecutionException。请添加 'mainClass' 属性

java - Hibernate native sql 查询无法正常工作

java - 我可以使用通用方法来访问 hibernate 中不同实体的数据吗