spring-data-jpa Sping Boot -将一个实体设置为在另一个实体中列出,多对多关系

4urapxun  于 2022-11-10  发布在  Spring
关注(0)|答案(3)|浏览(179)

我有两个实体Product和Tag。它们之间的关系是ManyToMany,因此一个产品可以有多个tag,一个tag可以分配给多个产品。应用程序的工作方式是先创建Product和Tag,然后通过PutMapping分配。
因此,我的问题是如何将Product分配到Tag Entity中的产品列表?
实体:

public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String productName;
    @ManyToMany
    private List<Tag> tag;
}

public class Tag{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String tagName;
    @ManyToMany
    private List<Product> product;
}

以及将Product分配给List in Tag并更新它的方法,但这不起作用。首先,我试图找到现有的Tag和Product,然后将Product设置为List in Tag实体。

public Tag update(Long productID, Long tagID, Tag tag){

 Tag udpatedTag = tagRepository.findById(tagID).get();
 Product product = productRepository.findById(productID).get();

 updatedTag.setProduct((List <Product>) product);
 tagRepository.save(updatedTag)

 return updatedTag;
}
cuxqih21

cuxqih211#

您希望将产品添加到列表中,而不是将Product转换为List。另外,请考虑将Tag中的product变量重命名为products,因为它是ProductCollection。此外,您应该考虑将Set用于ManyToManyMap。在互联网上挖掘一下,了解ListSetOneToManyManyToManyMap方面的差异。

public Tag update(Long productID, Long tagID, Tag tag){

  Tag udpatedTag = tagRepository.findById(tagID).get();
  Product product = productRepository.findById(productID).get();

  // Get the Collection and add the product to it
  updatedTag.getProduct().add(product);
  tagRepository.save(updatedTag)

  return updatedTag;
}
vohkndzv

vohkndzv2#

如果要使用多对多结构,则需要创建单独的表。
例如:enter image description here
您可以查看此站点-〉https://www.bezkoder.com/jpa-many-to-many/

1aaf6o9v

1aaf6o9v3#

正如Iane.麦克斯韦所建议的那样,如果创建一个单独的表,效果会更好,如下所示:
产品1---M产品_标签M----1标签
这样您就可以控制该表。但是如果您想使用@ManyToMany注解,请不要忘记在注解中使用mappedBy,否则它将创建两个表,即product_tag和tag_product。
我按照莱恩·麦克斯韦的建议做了我得到的结果是这样的:

{
    "id": 1,
    "tagName": "tag-1",
    "product": [
        {
            "id": 1,
            "productName": "product-1",
            "tag": []
        }
    ]
}

相关问题