好吧,我知道您的意思,但我认为这不是您的意思。你说
实际上,我有三个表,库存,类别和产品。@ManyToMany库存与类别之间的关系,以及@ManyToMany
类别与产品之间的关系。
这有助于抽象地考虑这一点。用陈记法说的是
但是,这可能不是您的意思。这是有问题的,因为您
将需要Category为每个StockandProduct
关系建立一个新的实体。因此,如果您有一个ETF类别,那么
BobsBestETFs产品中的每个股票(实际上是每个实例化关系)都将复制它。
您的意思可能更像是通过aStock和Product与Category属性的关系。
这允许许多产品都有很多库存,并且每种产品/库存关系都有特定的类别属性。您将遇到的问题
是,您不想Category成为一个属性,而是想要一个类别的查找表,如下所示:
我想这就是您要寻找的。
使用复合ID实施起来应该相当简单,但是您显示的示例似乎
有些过时或不清楚。最好找到更好的例子。这就是我
对最后一个架构进行建模的方式。
@Entitypublic class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;}@Entity@Datapublic class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;}@Entitypublic class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;}@Entity@Datapublic class StockProduct { @EmbeddedId private StockProductPk id; @ManyToOne @MapsId("productId") private Product product; @ManyToOne @MapsId("stockId") private Stock stock; @ManyToOne private Category category;}@Embeddable@Datapublic class StockProductPk implements Serializable { private static final long serialVersionUID = 1L; private Long stockId; private Long productId;}And as an example to use it:
private void create() { Category catEtf = new Category(); categoryRepo.save(catEtf); Stock s1 = new Stock(); stockRepo.save(s1); Product bobEtfs = new Product(); productRepo.save(bobEtfs); // create a relationship StockProduct bs1 = new StockProduct(); bs1.setId(new StockProductPk()); bs1.setProduct(bobEtfs); bs1.setStock(s1); bs1.setCategory(catEtf); stockProductRepo.save(bs1); }private void read() { StockProduct sp1 = new StockProduct(); Product p1 = new Product(); p1.setId(1L); sp1.setProduct(p1); List<StockProduct> bobEtfs = stockProductRepo.findAll(Example.of(sp1, ExampleMatcher.matching())); System.out.println(bobEtfs);}


