如何在JPA中保存外键实体

时间:2013-05-15 18:14:53

标签: java database hibernate jpa

我有2个表客户和客户历史。 customhistory有外键customerId,它引用了客户的customerId。在由JPA生成的实体中,我在customerhistory类中有一个customer对象,而我想在consumerhistory表中只保存customerId

我正在获得正确的customerId,但是当我想要保存属性customerId时,我只有客户的对象,但在自动生成的实体类消费历史中没有customerId

@Entity
public class Customerhistory implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int primarykeyId;

    //bi-directional many-to-one association to Customer
    @ManyToOne
    @JoinColumn(name="CustomerId")
    private Customer customer;

如上所示,我在实体customerHistory中没有customerId。如何保存?

3 个答案:

答案 0 :(得分:21)

使用entityManager的getReference调用使用id加载客户对象,然后将其设置到客户历史记录中。在大多数情况下,此调用将返回仅嵌入了id的代理,除非调用客户的其他方法,否则不会加载客户属性。

Customer customer = entityManager.getReference(Customer.class, cutomerId);

CustomerHistory newCustomerHistory = new CustomerHistory();
newCustomerHistory.setCustomer(customer);
entityManager.persist(newCustomerHistory);

答案 1 :(得分:2)

您的表之间的关联由JPA管理,您不应该访问customerHistory中的customerId。您应该使用customer.getHistory()(或您调用的任何内容)来操作关联的历史记录条目。引用完整性将由JPA管理。

答案 2 :(得分:0)

如果您使用eclipseLink作为JPA提供程序,则会有一个注释用于刷新关联的属性,在类之前设置如下:

@Cache(alwaysRefresh = true, disableHits = true)
public class TheMainEntity { 
    ...
    ...
    ...
    ...
}