首页 > 解决方案 > @ManyToMany 休眠映射的问题

问题描述

我是网络开发的新手。我一直在尝试制作一个电子商务平台,并使用之间的@ManyToMany映射product和用作连接表。wishlistwishlist_product

添加后,我没有遇到错误,但数据未添加到连接表中。我已经尝试解决此问题 2 天了,但一直面临持续失败。我已经附上了这两个wishlistproduct下面的代码。

@Entity
@Table(name = "wishlist")
public class Wishlist {

    @Id
    @Column(name = "username")
    /*
     * @GeneratedValue(generator = "gen")
     * 
     * @GenericGenerator(name = "gen", strategy = "foreign", parameters
     * = @Parameter(name = "property", value = "login"))
     */
    private String username;

    @ManyToMany
    @JoinTable(name = "wishlist_product", 
                joinColumns = @JoinColumn(name = "username"),
                inverseJoinColumns = @JoinColumn(name = "product_id"))
    private List<Electronics> product;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "electronics")
@DiscriminatorColumn(name = "product_Type", discriminatorType = DiscriminatorType.STRING)
public class Electronics {

    @Id
    @GenericGenerator(name = "CamIdGenerator", strategy = "com.virtusa.neuralhack.vlx.IdGenerator.CameraIdGenerator")
    @GeneratedValue(generator = "CamIdGenerator")
    // @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "product_id")
    private String productId;

    private String askingPrice;

    @Column(name = "age")
    private String howOld;

    @Column(name = "model")
    private String model;

    @Column(name = "brand")
    private String brand;

    @Column(name = "description")
    private String description;

    transient private String email;

    @ManyToOne
    @JoinColumn(name = "username")
    private User_Login user;

    @ManyToMany
    @JoinTable(name = "wishlist_product", joinColumns = @JoinColumn(name = "product_id"), inverseJoinColumns = @JoinColumn(name = "username"))
    private List<Wishlist> wishlist;
public void addToWishlist(String email, String productId) {

    Session currentSession = manager.unwrap(Session.class);
    Wishlist wishlist = currentSession.get(Wishlist.class,email);
        
    //System.out.println(wishlist.getUser());
        
    Electronics product = currentSession.get(Electronics.class, productId);
    System.out.println(product);

    wishlist.addToWishlist(product);
        
    //product.addAWishlist(wishlist);
    //System.out.println(wishlist.getProduct().get(0));

    currentSession.saveOrUpdate(wishlist);
}

在此处输入图像描述

标签: spring-boothibernatemany-to-many

解决方案


你应该这样做:

@Entity
@Table(name = "wishlist")
public class Wishlist {

    @Id
    @Column(name = "username")
    private String username;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name = "wishlist_product", 
                joinColumns = @JoinColumn(name = "username"),
                inverseJoinColumns = @JoinColumn(name = "product_id"))
    private List<Electronics> products;
    
    public void addProduct(Electronics product) {
       products.add( product );
       product.getWishlists().add( this );
    }

    public void removeProduct(Electronics product) {
      products.remove( product );
      product.getWishlists().remove( this );
    }
}


@Entity
@Table(name = "electronics")
public class Electronics {

   @Id
   @Column(name = "product_id")
   private String productId;
   
   @ManyToMany(mappedBy = "products")
   private List<Wishlist> wishlists;
}
  1. 注释只能映射双向 的拥有方。你应该在另一边使用。@ManyToMany@JoinTablemappedBy

  2. cascade如果要传播持久状态和其他状态,则应在拥有方设置属性。

  3. 为了保持双方之间的同步性,提供添加或删除子实体的辅助方法是一种很好的做法。

您的addToWishlist方法将如下所示:

public void addToWishlist(String email, String productId) {
   Session currentSession = manager.unwrap(Session.class);
   Wishlist wishlist = currentSession.get(Wishlist.class,email);
   Electronics product = currentSession.get(Electronics.class, productId);
   wishlist.addProduct(product);
   currentSession.saveOrUpdate(wishlist);
}

推荐阅读