2016-09-18 15 views
0

こんにちは、すべて1対多のrealtionshipを作成しています。 私は2つのテーブルを持っているEmpと他のプロジェクトです。 1つのEmpは多くのプロジェクトを持つことができます。 これは私のBeanクラスです。1対多の関係、子テーブル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; 
    } 

} 

これはこれは、これらが私のテーブルの構造

 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; 

である私の親を保存するためのコードと子

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(); 



} 


} 

ある

@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); 
       } 


     } 

    } 

プロジェクトのクラスです私の親クラスを保存するときはいつでも子クラスも保存されますが、empidカラムの値は0として保存されています。

私は何が問題なのか分かりませんし、助けてください。 この問題について検索しましたが、結果は見つかりませんでした。

答えて

1

あなたは関係の片側しか設定していないようです。 私は以下のようなものが必要だと思います。

project1.setEmp(emp);

+0

あなたは私のpojo.Iを見たことがあります両方の側に私のオブジェクトを追加したメソッドを追加しました。それは両方のオブジェクトを同期させます –

+0

残念ながら私の悪い..フォーカスの別のポイントはフェッチタイプ@ManyToOneを使用しています(fetch = FetchType.LAZY ) – user3014595

0

あなたのFOREIGN KEY列は、親テーブルを参照する必要があります "emp"テーブルのPRIMARY KEY列を意味します。私は

[email protected]マッピングを追加@OneToMany(= FetchType.EAGERをフェッチ、カスケード= CascadeType.ALL、mappedBy = Empのエンティティクラスで

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;

like- "プロジェクト" 構造を意味し、子テーブルを変更しました"emp") プライベートリストprojectList;私はこれがあなたのために働くだろうと思い

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

AS-

ともプロジェクトエンティティクラスに@ManyToOneマッピングを変更します。