Как скопировать первичный ключ (Shared Key) из основной таблицы в дочернюю таблицу в Hibernate.Я пытаюсь сделать однонаправленное отображение (Employee
имеет ссылку на Address
, а не наоборот).
Дополнительная информация: Зависимость гибернации:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.1.Final</version>
</dependency>
У меня есть Employee
класс и Address
сущности, как указано ниже.Я пытаюсь сгенерировать первичный ключ в сущности Employee
для сущности Address
.
Но, я вижу, employeeId
в ADDRESS
таблица всегда генерируется как 0 в спящем режиме (я ожидал, что это будет скопировано).Я думаю, я бы поступил неправильно при использовании @PrimaryKeyJoinColumn
или @MapsId
.Я попытался добавить оба или добавить один из них, но не повезло.
Ниже приведена схема соответствующих таблиц:
create table EMPLOYEE(
EMPLOYEE_ID int auto_increment,
NAME varchar(100),
SALARY double,
primary key(EMPLOYEE_ID)
);
create table ADDRESS
(
EMPLOYEE_ID int references EMPLOYEE.EMPLOYEE_ID,
STREET_NAME varchar(40),
CITY_NAME varchar(40),
STATE_NAME varchar(40),
ZIP_CODE varchar(40),
primary key(EMPLOYEE_ID)
);
Отображение сущности выглядит следующим образом:
Employee.java
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MapsId;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import java.io.Serializable;
@Entity
@Table(name = "EMPLOYEE")
public class Employee implements Serializable {
@Id
@Column(name = "EMPLOYEE_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "NAME")
private String name;
@Column(name = "SALARY")
private double salary;
@OneToOne
@JoinColumn(name="EMPLOYEE_ID")
@MapsId
//@PrimaryKeyJoinColumn
private Address address;
public int getId() {
return id;
}
public Employee setId(int id) {
this.id = id;
return this;
}
public String getName() {
return name;
}
public Employee setName(String name) {
this.name = name;
return this;
}
public double getSalary() {
return salary;
}
public Employee setSalary(double salary) {
this.salary = salary;
return this;
}
public Address getAddress() {
return address;
}
public Employee setAddress(Address address) {
this.address = address;
return this;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
", address=" + address +
'}';
}
}
Address.java
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MapsId;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import java.io.Serializable;
@Entity
@Table(name = "ADDRESS")
public class Address implements Serializable {
@Id
@Column(name = "EMPLOYEE_ID")
private int id;
@Column(name = "STREET_NAME")
private String streetName;
@Column(name = "CITY_NAME")
private String cityName;
@Column(name = "STATE_NAME")
private String stateName;
@Column(name = "ZIP_CODE")
private String zipCode;
public int getId() {
return id;
}
public Address setId(int id) {
this.id = id;
return this;
}
public String getStreetName() {
return streetName;
}
public Address setStreetName(String streetName) {
this.streetName = streetName;
return this;
}
public String getCityName() {
return cityName;
}
public Address setCityName(String cityName) {
this.cityName = cityName;
return this;
}
public String getStateName() {
return stateName;
}
public Address setStateName(String stateName) {
this.stateName = stateName;
return this;
}
public String getZipCode() {
return zipCode;
}
public Address setZipCode(String zipCode) {
this.zipCode = zipCode;
return this;
}
@Override
public String toString() {
return "Address{" +
"id=" + id +
", streetName='" + streetName + '\'' +
", cityName='" + cityName + '\'' +
", stateName='" + stateName + '\'' +
", zipCode='" + zipCode + '\'' +
'}';
}
}
Метод сохранения:
public Employee save(Employee employee){
Session session = HibernateUtil.buildSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.save(address); // Should I do this?
session.save(employee);
transaction.commit();
return employee;
}