1 回答

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
好吧,我知道你說(shuō)的是什么,但我認(rèn)為這不是你的意思。你說(shuō)
實(shí)際上我有三個(gè)表,Stock、Category 和 Product。
@ManyToMany
Stock 和 Category 之間的關(guān)系,以及@ManyToMany
Category 和 Product 之間的關(guān)系。
這有助于抽象地思考這個(gè)問(wèn)題。在陳記法中你說(shuō)的是
但是,這可能不是您的意思。這是有問(wèn)題的,因?yàn)槟枰?code>Category為每個(gè)Stock
和Product
關(guān)系創(chuàng)建一個(gè)新實(shí)體。因此,如果您有一個(gè) ETF 類別,那么它將針對(duì) BobsBestETF 產(chǎn)品中的每只股票進(jìn)行復(fù)制,實(shí)際上是針對(duì)每個(gè)實(shí)例化關(guān)系進(jìn)行復(fù)制。
你的意思可能更像是 a Stock
andProduct
與Category
屬性的關(guān)系,就像這樣。
這允許許多產(chǎn)品,每個(gè)產(chǎn)品都有很多庫(kù)存,每個(gè)產(chǎn)品/庫(kù)存關(guān)系都有一個(gè)特定的類別屬性。您將遇到的問(wèn)題是您不想Category
成為一個(gè)屬性,而是一個(gè)類別查找表,如下所示:
我認(rèn)為這就是您要找的。使用復(fù)合 ID 實(shí)現(xiàn)這應(yīng)該相當(dāng)簡(jiǎn)單,但您顯示的示例似乎有些過(guò)時(shí)或不清楚。最好找到更好的例子。這就是我為最后一個(gè)模式建模的方式。
@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);
}
添加回答
舉報(bào)