2017-03-21 12 views
0

私は1つの親オブジェクトをEmployeeオブジェクトとchildオブジェクトとしてAddressとして持っています。私は、Employeeオブジェクトを使用して両方のオブジェクトを更新する必要があります。しかし、従業員オブジェクトiを使用して更新する場合、emp_idを取得するだけでnullにはなりません。ここに私のテーブルと実体1対1リレーションシップを使用した更新hibernate

CREATE TABLE `employee` (
`employee_id` bigint(20) NOT NULL AUTO_INCREMENT, 
`employee_name` varchar(30) NOT NULL, 
`employee_desg` varchar(30) NOT NULL, 
`salary` varchar(30) NOT NULL, 
`employee_reference_id` varchar(10) NOT NULL, 
PRIMARY KEY (`employee_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

アドレステーブル

CREATE TABLE `address` (
`address_id` bigint(20) NOT NULL AUTO_INCREMENT, 
`emp_id` bigint(20) NOT NULL, 
`address` varchar(255) NOT NULL, 
PRIMARY KEY (`address_id`), 
KEY `employee_address` (`emp_id`), 
CONSTRAINT `employee_address` FOREIGN KEY (`emp_id`) REFERENCES `employee` (`employee_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

Employeeオブジェクト

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name = "Employee") 
public class Employee { 

@Id 
@GeneratedValue 
@Column(name = "EMPLOYEE_ID") 
private int id; 

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

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

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

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

public String getEmployeeReferenceId() { 
    return employeeReferenceId; 
} 

public void setEmployeeReferenceId(String employeeReferenceId) { 
    this.employeeReferenceId = employeeReferenceId; 
} 

@OneToOne(mappedBy="employee", cascade = CascadeType.ALL) 
private Address address; 


public String getEmployeeName() { 
    return employeeName; 
} 

public void setEmployeeName(String employeeName) { 
    this.employeeName = employeeName; 
} 

public String getEmployeeDesg() { 
    return employeeDesg; 
} 

public void setEmployeeDesg(String employeeDesg) { 
    this.employeeDesg = employeeDesg; 
} 

public String getSalary() { 
    return salary; 
} 

public void setSalary(String salary) { 
    this.salary = salary; 
} 

public Address getAddress() { 
    return address; 
} 

public void setAddress(Address address) { 
    this.address = address; 
} 

public int getId() { 
    return id; 
} 

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

} 

アドレスオブジェクト

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 



@Entity 
@Table(name = "ADDRESS") 
public class Address { 

@Id 
@Column(name="ADDRESS_ID") 
@GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 

@Column(name = "ADDRESS") 
private String address; 
@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL, orphanRemoval=true) 
@JoinColumn(name="emp_id",referencedColumnName="employee_id") 
private Employee employee; 

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

public Employee getEmployee() { 
    return employee; 
} 

public void setEmployee(Employee employee) { 
    this.employee = employee; 
} 

public Address() { 

} 

public int getId() { 
    return id; 
} 

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

私のコードは

です
public class StudentUtil1To1 { 
public static void main(String args[]){ 
    SessionFactory factory=null; 
    Configuration configuration=null; 
    ServiceRegistry registry=null; 
    Session session=null; 
    try{ 
     configuration= new Configuration(); 
     configuration.configure(); 
     registry=new StandardServiceRegistryBuilder().configure().applySettings(configuration.getProperties()).build(); 
     factory=configuration.configure("hibernate.cfg.xml").buildSessionFactory(registry); 
     session= factory.openSession(); 
     session.beginTransaction(); 


      Employee emp=new Employee(); 
      emp.setId(1); 
      emp.setEmployeeReferenceId("CP001"); 
      emp.setEmployeeName("Muthu"); 
      emp.setEmployeeDesg("Developer"); 
      emp.setSalary("15000"); 

      Address address=new Address(); 
      address.setAddress("3, Civil aerodrome, CBE"); 


      emp.setAddress(address); 
      address.setEmployee(emp); 
      session.update(emp); 



     System.out.println("Successfuly Saved"); 
     session.getTransaction().commit(); 

    }catch(Exception e){ 
     e.printStackTrace(); 
    }finally{ 
     if(session!=null){ 
      session.close(); 
     } 
     if(factory!=null){ 
      factory.close(); 
     } 
    } 
} 
} 

とエラーが、私は更新のために必要なもの

09:40:48.815 [http-nio-8081-exec-7] WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1048, SQLState: 23000 
09:40:48.816 [http-nio-8081-exec-7] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Column 'emp_id' cannot be null 

です。私の間違いを訂正してください。

+0

ようにあなたがしているので、マージ、これらのエンティティに –

+0

更新ビクラムのシン –

+0

の代わりに使用して更新の使用を節約するためにあなたのコードを唯一の従業員オブジェクトを表示、保存しますデタッチされたインスタンスを使用する –

答えて

1

@OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL, orphanRemoval=true) 
@JoinColumn(name="emp_id",referencedColumnName="employee_id") 
private Employee employee; 
を意味し、上記のコード210

アドレスクラスから従業員の属性を削除アドレスに entity.And を必要とされていません。 は今、あなたはすでに注釈OneToOne CascadeType.ALLを追加し、この

Employee emp=new Employee(); 
      Address address=new Address("your address"); 
      emp.setAddress(address); 
      emp.setId(1); 
      emp.setEmployeeReferenceId("CP001"); 
      emp.setEmployeeName("Muthu"); 
      emp.setEmployeeDesg("Developer"); 
      emp.setSalary("15000"); 
      session.update(emp); 
0

1. @ MapppedByアノテーションとは、@ MapppedByでアノテーションされたエンティティであり、keyの参照をあきらめているため、employeeテーブルでは「address_id」という列はありません。 "アドレス"テーブルによって制御される従業員と住所との関係。 2. [session.update(emp);]を使用すると、 "Employee"テーブルのデータはありません。emp_idはFOREIGN KEYなので、この問題が発生します。 3.最初にEmployeeを挿入し、 session.update(EMP);あなたはすでにあなたはアドレスクラスで同じことを行うには持っていけないこの

@OneToOne(mappedBy="employee", cascade = CascadeType.ALL) 
private Address address; 

よう住所エンティティ従業員エンティティをマッピングしているので]

関連する問題