2016-09-18 30 views
0

Hi所有創建一個到多個的任務。 我有2個表格,一個是Emp,另一個是Project。 One Emp可以有很多Project。 這些是我的bean類。休眠一對多關係,子表格foriegn密鑰表設置0值

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; 

每當我保存我的父類我的子類也獲得保存,但empid列值被保存爲0.每次保存爲0.

請我不知道什麼是問題並感謝您的幫助。 我有搜索關於這個問題,但沒有找到任何結果。

回答

1

它似乎是你只設置關係的一方。 我覺得在這裏需要一些東西

project1.setEmp(emp);

+0

你見過我的pojo.I有添加我的對象兩側的方法。它同步這兩個對象 –

+0

對不起我的壞..另一個重點是使用獲取類型@ManyToOne(fetch = FetchType.LAZY ) – user3014595

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(取= FetchType.EAGER,級聯= CascadeType.ALL,的mappedBy = 「emp」) private List projectList;

以及在項目實體類修改@ManyToOne映射原樣

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

我想這將會爲你工作。