1 回答
TA贡献1786条经验 获得超11个赞
好吧,我知道你说的是什么,但我认为这不是你的意思。你说
实际上我有三个表,Stock、Category 和 Product。
@ManyToMany
Stock 和 Category 之间的关系,以及@ManyToMany
Category 和 Product 之间的关系。
这有助于抽象地思考这个问题。在陈记法中你说的是
但是,这可能不是您的意思。这是有问题的,因为您需要Category
为每个Stock
和Product
关系创建一个新实体。因此,如果您有一个 ETF 类别,那么它将针对 BobsBestETF 产品中的每只股票进行复制,实际上是针对每个实例化关系进行复制。
你的意思可能更像是 a Stock
andProduct
与Category
属性的关系,就像这样。
这允许许多产品,每个产品都有很多库存,每个产品/库存关系都有一个特定的类别属性。您将遇到的问题是您不想Category
成为一个属性,而是一个类别查找表,如下所示:
我认为这就是您要找的。使用复合 ID 实现这应该相当简单,但您显示的示例似乎有些过时或不清楚。最好找到更好的例子。这就是我为最后一个模式建模的方式。
@Entity
public class Stock {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Entity
@Data
public class Product {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Entity
public class Category {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Entity
@Data
public class StockProduct {
@EmbeddedId
private StockProductPk id;
@ManyToOne
@MapsId("productId")
private Product product;
@ManyToOne
@MapsId("stockId")
private Stock stock;
@ManyToOne
private Category category;
}
@Embeddable
@Data
public class StockProductPk implements Serializable {
private static final long serialVersionUID = 1L;
private Long stockId;
private Long productId;
}
并作为使用它的示例:
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);
}
添加回答
举报