Spring boot @ManyToMany hibernate映射问题

Spring boot @ManyToMany hibernate映射问题,spring-boot,hibernate,many-to-many,Spring Boot,Hibernate,Many To Many,我是网络开发新手。我一直在尝试制作一个电子商务平台,并使用@manytomy在产品和愿望列表之间进行映射,使用愿望列表(product作为联接表 添加时,我没有遇到错误,但数据没有添加到联接表中。我已经尝试解决这个问题两天了,但一直面临失败。我已经在下面附上了愿望列表和产品的代码 @实体 @表(name=“wishlist”) 公共类愿望列表{ @身份证 @列(name=“username”) /* *@GeneratedValue(generator=“gen”) * *@GenericGe

我是网络开发新手。我一直在尝试制作一个电子商务平台,并使用
@manytomy
产品
愿望列表
之间进行映射,使用
愿望列表(product
作为联接表

添加时,我没有遇到错误,但数据没有添加到联接表中。我已经尝试解决这个问题两天了,但一直面临失败。我已经在下面附上了
愿望列表
产品
的代码

@实体
@表(name=“wishlist”)
公共类愿望列表{
@身份证
@列(name=“username”)
/*
*@GeneratedValue(generator=“gen”)
* 
*@GenericGenerator(name=“gen”,strategy=“foreign”,参数
*=@参数(name=“property”,value=“login”))
*/
私有字符串用户名;
@许多
@JoinTable(name=“wishlist\u产品”,
joinColumns=@JoinColumn(name=“username”),
inverseJoinColumns=@JoinColumn(name=“product_id”))
私有列表产品;
@实体
@继承(策略=InheritanceType.SINGLE_表)
@表(name=“electronics”)
@鉴别器列(name=“product\u Type”,鉴别器类型=鉴别器类型.STRING)
公共类电子产品{
@身份证
@GenericGenerator(name=“CamIdGenerator”,strategy=“com.virtusa.neuralhack.vlx.IdGenerator.CameraIdGenerator”)
@GeneratedValue(generator=“CamIdGenerator”)
//@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“product\u id”)
私有字符串productId;
私人字符串询问价格;
@列(name=“age”)
私有字符串的长度;
@列(name=“model”)
私有字符串模型;
@列(name=“brand”)
自有品牌;
@列(name=“description”)
私有字符串描述;
临时私人字符串电子邮件;
@许多酮
@JoinColumn(name=“username”)
私人用户\登录用户;
@许多
@JoinTable(name=“wishlist\u product”,joinColumns=@JoinColumn(name=“product\u id”),inverseJoinColumns=@JoinColumn(name=“username”))
私人名单愿望清单;
public void addToWishlist(字符串email,字符串productId){
Session currentSession=manager.unwrap(Session.class);
Wishlist Wishlist=currentSession.get(Wishlist.class,email);
//System.out.println(wishlist.getUser());
电子产品=currentSession.get(Electronics.class,productId);
系统输出打印项次(产品);
愿望清单。添加愿望清单(产品);
//产品添加列表(愿望列表);
//System.out.println(wishlist.getProduct().get(0));
currentSession.saveOrUpdate(wishlist);
}

您应该这样做:

@实体
@表(name=“wishlist”)
公共类愿望列表{
@身份证
@列(name=“username”)
私有字符串用户名;
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name=“wishlist\u产品”,
joinColumns=@JoinColumn(name=“username”),
inverseJoinColumns=@JoinColumn(name=“product_id”))
私人上市产品;
公共产品(电子产品){
产品。添加(产品);
product.getWishList().add(此);
}
公共产品(电子产品){
产品。移除(产品);
product.getWishList().remove(此);
}
}
@实体
@表(name=“electronics”)
公共类电子产品{
@身份证
@列(name=“product\u id”)
私有字符串productId;
@许多(mappedBy=“产品”)
私人名单愿望者;
}
  • 只有
    @manytomy
    的拥有方应该被
    @JoinTable
    注释映射。您应该在另一端使用
    mappedBy

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

  • 为了保持双方之间的同步性,最好提供用于添加或删除子实体的辅助方法

  • 您的
    addToWishlist
    方法如下所示:

    public void addToWishlist(字符串email,字符串productId){
    Session currentSession=manager.unwrap(Session.class);
    Wishlist Wishlist=currentSession.get(Wishlist.class,email);
    电子产品=currentSession.get(Electronics.class,productId);
    愿望清单。添加产品(产品);
    currentSession.saveOrUpdate(wishlist);
    }
    
    确保您在读写事务中,而不是只读事务中

    一些人建议:

    • 不要使用
      cascade=CascadeType。由于
      CascadeType,所有
      与多对多关联。所有
      包括
      CascadeType。删除
      ,在多对多导致实体过多的情况下删除
    • 当您不需要特定的顺序时,使用Set而不是List来表示多个关联

    Hii@SternK,我尝试了上述步骤,但结果仍然相同。我应该附加更多代码以供参考吗?我也尝试了更改joinColumns和inverseJoinColumns,但结果没有改变……我建议您启用hibernate属性
    hibernate.show_sql
    hibernate.format_sql
    hibernate.use_sql_comments
    并查看sql hibernate到底执行了什么。我测试了上述映射,它对我很有效。嘿,Stern,谢谢你一直以来的帮助。除了你建议的更改之外,我还错过了在我的服务类方法上添加@Transactional注释的机会。它现在工作得很好……谢谢:)谢谢你的帮助。我在我的add-to-wishlist方法中引入了@Transactional注释,它对我非常有用。。。