2017-05-13 14 views
1

以下のエンティティと、@ManyToManyの2つのマッピングがあります。@ManyToMany Hibernateのみ更新JoinTable

@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)ユーザおよび製品は既にdatabasaeに存在しており、それらの間の関係は、私は、行がすでにユーザーと製品のために存在しているだけなのでJoinTable (user_products_mapper)内のレコードを挿入する)@ManyToMany

3です。

4)これを達成する1つの方法は、私は上記の持っているだけで

User.addProducts 

5を呼び出すと、このユーザーを行う前に)UNIDIRECTIONALマッピングを使用することで、製品のエンティティは以下のように取得されます:

User user = this.userDao.findOne(userId); 
     if(user == null){ 
      //throw exception 
     } 
     Products product = this.productDao.findOne(productId); 

6)これを行う方法はありますか?

答えて

3

Hibernate/JPAを使用している場合、実行されている実際のクエリを制御することはできませんが、あなたはどちらにも対応していません。ユーザーを接続するために、製品のようなものになるだろうどうなるのか

:(あなたが両方ProductUserを取得しますので)これは単なる行を挿入するよりもクエリになります

@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); 
} 

が、あなたが得るのは、シンプルでプレーンなJavaコードです。ほとんどの場合、余分なクエリのコストは許容範囲内です。

関連する問題