仅加载ManyToOne关系的ID

时间:2016-10-07 12:38:03

标签: java hibernate

我在使用hibernate时遇到了性能问题。我有以下内容:

@Data
@Entity
@Table(name="\"Order_product\"")
public class OrderProduct {
    @Id
    @SequenceGenerator(name="Order_product_id_seq",
            sequenceName="Order_product_id_seq",
            allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator="Order_product_id_seq")
    private long id;
    @ManyToOne
    @NotNull
    private Product product;
    @ManyToOne
    @NotNull
    private ProductPrice price;
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @NotNull
    private Order order;
}

现在,每当我尝试执行时:

List<OrderProduct> findByOrderId(@Param(value = "order") Long orderId);

Hibernate将为每个OrderProduct加载整个Order。如何禁用它,以便只加载订单的ID?

1 个答案:

答案 0 :(得分:1)

由于关联是懒惰的,您已经处于良好的轨道,因此Hibernate将在Order字段中代理order

但是,只要调用其任何方法,代理实例就会初始化。查看this question,了解如何在仅需要id时指向代理初始化(在您的情况下指向关联实体的外键)。当然,请确保不要在代理上调用其他方法。

或者,您可以显式映射外键列并使用它而不是访问关联实体(它必须既不可插入也不可更新,因为该列已在关联中映射):

@Column(name = "order_id", insertable = false, updatable = false)
private long orderId;