我试图做一对一的双向休眠实体。当我保存父对象时,它不会填充子对象上的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;
答案 0 :(得分:0)
由于它是双向关系,您应该在两端设置它。意思是,在父级中设置对子对象的引用,并在子级中设置对父对象的引用。它应该工作。 像这样的东西
Customer cust = new Customer();
CustomerAddress custAddr = new CustomerAddress();
cust.setCustomerAddress( custAddr );
custAddr.setCustomer( cust );