@ManyToMany Hibernate只更新JoinTable

时间:2017-05-13 10:06:27

标签: java hibernate

我在两者之间有以下实体和@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)有没有办法做到这一点?

1 个答案:

答案 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);
}

这将导致更多的查询而不仅仅是插入一行(因为您将同时获取ProductUser),但您获得的是简单而简单的Java代码。在大多数情况下,额外查询的成本完全在可接受的范围内。