我有这些表:
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);
我想要的是删除我需要从数据库带来产品的那部分。
我想直接使用 idsetProduct
newOrderProduct
。
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)
详细的插入说明。