我在两者之间有以下实体和@ManyToMany
映射。
@Entity
@Table(name = "user")
public class User implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 5340562707217344212L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
private String userName;
private String password;
private String firstName;
private String lastName;
private String emailId;
private Date createdDate;
private Byte status;
private Date lastModifiedDate;
@ManyToMany
@JoinTable(name = "user_products_mapper",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "product_id")
)
private List<Products> products = new ArrayList<Products>();
public void addProducts(Products product){
this.products.add(product);
}
@Entity
@Table(name="products")
public class Products implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1895580713896126954L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long productId;
private String productName;
private String description;
private double minBalance;
public Long getProductId() {
return this.productId;
}
public void setProductId(Long productId) {
this.productId = productId;
}
public String getProductName() {
return this.productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
我的问题是:
1)我已经持有这些实体了。 (User and Products)
2)用户和产品已存在于数据库中,它们之间的关系为@ManyToMany
3)我想仅在JoinTable (user_products_mapper)
中插入记录,因为用户和产品已存在行。
4)实现此目的的一种方法是使用上面的UNIDIRECTIONAL
映射,然后调用
User.addProducts
5)在执行此操作之前,将提取用户和产品实体,如下所示:
User user = this.userDao.findOne(userId);
if(user == null){
//throw exception
}
Products product = this.productDao.findOne(productId);
6)有没有办法做到这一点?
答案 0 :(得分:3)
使用Hibernate / JPA时,您无法控制正在运行的实际查询,但您也不应该这样做。
连接用户和产品的方法如下:
@Transactional
public void addProductToUser(final Long userId, final Long productId) {
final User user = em.find(User.class, userId);
final Product product = em.find(Product.class, productId);
user.addProduct(product);
}
这将导致更多的查询而不仅仅是插入一行(因为您将同时获取Product
和User
),但您获得的是简单而简单的Java代码。在大多数情况下,额外查询的成本完全在可接受的范围内。