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来表示多个关联
hibernate.show_sql
,hibernate.format_sql
,hibernate.use_sql_comments
并查看sql hibernate到底执行了什么。我测试了上述映射,它对我很有效。嘿,Stern,谢谢你一直以来的帮助。除了你建议的更改之外,我还错过了在我的服务类方法上添加@Transactional注释的机会。它现在工作得很好……谢谢:)谢谢你的帮助。我在我的add-to-wishlist方法中引入了@Transactional注释,它对我非常有用。。。