hibernate一对多关系,子表foriegn key table设置0值

时间:2016-09-18 20:15:21

标签: java mysql hibernate jpa jpa-2.0

大家好,创造一对多的关系。 我有2个表一个是Emp,另一个是Project。 一个Emp可以有很多项目。 这些是我的bean类。

 public class Emp {

    public List<Project> getProjectList() {
        return projectList;
    }

    public void setProjectList(List<Project> projectList) {
        this.projectList = projectList;
    }

    @Generated(value = { "id" })
    @Id
    private int id;

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

    @Column(name="city")
    private String  city;

    @OneToMany( cascade=CascadeType.ALL , fetch=FetchType.LAZY, mappedBy="emp",orphanRemoval=true)
    private List<Project> projectList=new ArrayList<Project>();


    public void addProject(Project project) {
        this.projectList.add(project);
        if (project.getEmp() != this) {
            project.setEmployer(this);
        }
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

}

这是项目类

 @Entity
        public class Project {




        @Generated(value = { "id" })
        @Id
        private int id;

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

        @ManyToOne(cascade=CascadeType.ALL)
        @JoinColumn(name="empid", nullable=false)
        private Emp emp;


        public int getId() {
            return id;
        }


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


        public String getName() {
            return name;
        }


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


        public Emp getEmp() {
            return emp;
        }


        public void setEmp(Emp emp) {
            this.emp = emp;
        }


        public void setEmployer(Emp emp2) {
             this.emp = emp2;
                if (!emp2.getProjectList().contains(this)) { // warning this may cause performance issues if you have a large data set since this operation is O(n)
                    emp.getProjectList().add(this);
                }


        }

    }

这是我保存父母和孩子的代码

public class MainTest {

public static void main(String[] args) {
    Configuration configuration = new Configuration();
    configuration.addAnnotatedClass(org.hibernate.model.Emp.class);
    configuration.addAnnotatedClass(org.hibernate.model.Project.class);
    configuration.addAnnotatedClass(org.hibernate.model.Stu.class);
    configuration.addAnnotatedClass(org.hibernate.model.Address.class);



    configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/test");
    configuration.setProperty("hibernate.connection.password", "123456789");
    configuration.setProperty("hibernate.connection.username", "root");
    configuration.setProperty("hibernate.show_sql", "true");
    configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
    SessionFactory sessionFactory = configuration.buildSessionFactory();


Session session =   sessionFactory.openSession();
org.hibernate.Transaction transaction =session.beginTransaction();

Emp emp = new Emp();
emp.setCity("nagaland");
emp.setName("divyffa");

Project project1=new Project();
project1.setName("dotedxvc");
emp.addProject(project1);
session.save(emp);
transaction.commit();
session.close();



}


}

这是我表格的结构

      CREATE TABLE `emp` (

      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(45) DEFAULT NULL,
      `city` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;


    CREATE TABLE `project` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(45) DEFAULT NULL,
      `empid` int(11) NOT NULL,
      PRIMARY KEY (`id`),

  KEY `forgn-project_idx` (`empid`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;

每当我保存我的Parent类时,我的子类也会被保存,但empid列值将保存为0.每次保存为0时。

请问我不知道是什么问题,谢谢你的帮助。 我搜索了这个问题,但没有找到任何结果。

2 个答案:

答案 0 :(得分:1)

似乎你只设置了一方的关系。 我认为下面的一些事情需要在这里

project1.setEmp(EMP);

答案 1 :(得分:0)

我认为你的FOREIGN KEY列应该引用父表的意思是“emp”表PRIMARY KEY列。我修改了子表意味着“项目”结构,如 -

CREATE TABLE `project` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`empid` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 FOREIGN KEY (empid) REFERENCES emp (id)
  ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8; 

在Emp实体类中,将@OneToMany映射添加为 -

@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL,mappedBy =“emp”)      private List projectList;

以及在Project实体类中将@ManyToOne映射修改为 -

@ManyToOne(optional = false)
@JoinColumn(name = "empid", insertable = true)  
private Emp emp;

我想这对你有用。