【问题标题】:Hibernate unidirectional one-to-one mappingHibernate 单向一对一映射
【发布时间】:2022-01-03 15:52:07
【问题描述】:

我有以下表结构。 (唯一的限制是避免同一员工有多个“详细信息”——我无法更改数据库结构)。

https://i.ibb.co/r3pYQFj/fk.png

create table employee (
    employee_id number(19),
    salary number(10),
    constraint pk_employee primary key (employee_id)
);

create table employee_details (
    employee_details_id number(19),
    employee_id number(19) not null,
    address varchar2(256),
    gender char(1),
    constraint fk_employee foreign key (employee_id) references employee (employee_id),
    constraint fk_employee_unq unique (employee_id)
);

模型类:

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

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "empgen")
    @SequenceGenerator(name = "empgen", sequenceName = "SEQ_EMP", allocationSize = 1)
    @Column(name = "EMPLOYEE_ID")
    private Long id;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name="EMPLOYEE_ID")
    private EmployeeDetail empDetail;
    
    ...

@Entity
@Table(name = "EMPLOYEE_DETAIL")
public class EmployeeDetail implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "empdetgen")
    @SequenceGenerator(name = "empdetgen", sequenceName = "SEQ_EMP_DET", allocationSize = 1)
    @Column(name = "EMPLOYEE_DETAILS_ID")
    private Long id;

    @Column(name = "EMPLOYEE_ID")
    private Long employeeId;

    ...

我有一个接收这样的 JSON 的休息控制器:

{
  "employee": {
    "salary": 80000,
    "empDetail": {
      "adress": "ST EXAMPLE",
      "gender": "M"
    }
  }
}

我正在尝试通过休眠 (5.4.28) 将所有实体保存为第一个实体,然后使用它的主键,EmployeeDetails 使用它的父主键,但我得到了这个:

java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("DCC"."EMPLOYEE_DETAILS"."EMPLOYEE_ID")

为什么要在父母之前救孩子?

类应该如何映射?

【问题讨论】:

    标签: sql hibernate jpa hibernate-mapping


    【解决方案1】:

    我猜这是因为 Hibernate 认为通过将 @JoinColumn 放在 Employee.empDetail 上,EMPLOYEE_ID 属于 employee_details 表。

    尝试创建属性EmployeeDetail.employee 并将@JoinColumn 放在该属性上。如果您需要来自Employee 的参考,请使用@OneToOne(mappedBy=...)

    【讨论】:

    • 我得到'对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例'
    • 您是否将级联属性添加到@OneToOne?
    • 是的,但仍然无法正常工作。 @OneToOne(mappedBy="employee", cascade = CascadeType.ALL) AND @JoinColumn(name = "EMPLOYEE_ID") @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) –
    猜你喜欢
    • 2014-11-22
    • 2011-04-24
    • 2021-08-18
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多