如何使用一对多数据库结构映射一对一的休眠实体?

时间:2015-08-12 19:51:30

标签: java entity-framework hibernate one-to-one

我试图做一对一的双向休眠实体。当我保存父对象时,它不会填充子对象上的customer_id。我无法弄清楚原因。我希望有一些方法可以通过hibernate注释告诉它这样做。

我的实体看起来像

@Table(name = "customer")
public class CustomerEntity {

    @Id
    @Column(name = "id")
    private Long id;

    @OneToOne(mappedBy = "customer", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private CustomerAddressEntity customerAddress;

    ..more
}

@Table(name="customer_address")
@GenericGenerator(name="generator", strategy="increment")
public class CustomerAddressEntity {

    @Id
    @Column(name = "id")
    @GenericGenerator(name = "sequence_customer_address_id", strategy = "com.abc.enrollment.service.IdGenerator")
    @GeneratedValue(generator = "sequence_customer_address_id")
    private Long id;

    @OneToOne
    @JoinColumn(name = "customer_id", referencedColumnName = "id")
    private CustomerEntity customer;

    ..more
}

表格看起来像

CREATE TABLE enroll.customer_address(
id                 NUMBER(38,0) NOT NULL,
customer_id        NUMBER(38,0) )

CREATE TABLE enroll.customer (
id                 NUMBER(38,0) NOT NULL)

hibernateVersion =" 5.0.0.CR2"

除了接受的答案之外,我还必须做一些让它发挥作用的其他事情。我会在这里发布它,以防它帮助其他人。我们使用lombok并在对象上进行JSON序列化。以下注释避免了堆栈溢出错误。

@ToString(exclude = "customer")
@EqualsAndHashCode(exclude = "customer")
public class CustomerAddressEntity {

@JsonIgnore
private CustomerEntity customer;

1 个答案:

答案 0 :(得分:0)

由于它是双向关系,您应该在两端设置它。意思是,在父级中设置对子对象的引用,并在子级中设置对父对象的引用。它应该工作。 像这样的东西

Customer cust = new Customer();
CustomerAddress custAddr = new CustomerAddress();
cust.setCustomerAddress( custAddr );
custAddr.setCustomer( cust );