休眠 - 仅使用 id 设置多对一列值,而不设置对象实例



我有这些表:

Name: product
Rows: id
Name: order_product
Rows: id, product_id

在 java 中映射如下:

@Entity
@Table(name = "product")
public class Product{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "product")
private Set<OrderProduct> orderProductList = new LinkedHashSet<>();
//...
}
@Entity
@Table(name = "order_product")
public class OrderProduct{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "product_id")
private Product product;
//...
}

当我想创建一个新的订单产品时,我会这样做:

//existing info
productId = 1;
//get from db product which have id 1
Product product = session.createQuery("FROM Product WHERE id = :pId", Product.class)
.setParameter("pId", productId)
.getSingleResult();
//create order product
OrderProduct newOrderProduct = new OrderProduct();
newOrderProduct.setProduct(product);
//put in db
session.save(newOrderProduct);

我想要的是删除我需要从数据库带来产品的那部分。

我想直接使用 idsetProductnewOrderProduct

newOrderProduct.setProduct(productId);

我知道我可以通过消除ManyToOne并将可变乘积声明为Integer来做到这一点。但我不想失去ManyToOne的好处.

有一种方法可以仅通过id设置产品,而无需Product实例?

这可以通过 FluentJPA 完成:

public boolean createOrderProduct(int productId) {
FluentQuery query = FluentJPA.SQL((OrderProduct op) -> {
INSERT().INTO(op);
VALUES(row(productId));
});
return query.createQuery(em).executeUpdate() > 0;
}

生成的 SQL:

INSERT   INTO order_product t0 
VALUES (?1)

详细的插入说明。

最新更新