我有一个案例,女巫是要使用Extras列实现自我连接多对多关系。 场景是我有产品(foo)可能由其他产品(bar1和bar 2)组成,女巫表示一个产品可以由许多产品组成<-------->产品可以由许多产品组成>
我试图像这样实现它,但似乎根本没有用。
import javax.persistence.Embeddable;
import javax.persistence.ManyToOne;
import java.io.Serializable;
import java.util.Objects;
@Embeddable
public class ProductCompositionid implements Serializable {
@ManyToOne()
private Product productMaster;
@ManyToOne()
private Product productDetails;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
return false;
ProductCompositionid that = (ProductCompositionid) o;
return Objects.equals(that.productDetails, this.productDetails) &&
Objects.equals(that.productMaster, this.productMaster);
}
@Override
public int hashCode() {
return Objects.hash(productMaster, productDetails);
}
}
加入表格
import javax.persistence.*;
import java.util.Objects;
@Entity
@Table(name = "composition")
@AssociationOverrides({
@AssociationOverride(name = "productCompositionid.productMaster",
joinColumns = @JoinColumn(name = "idproduct")),
@AssociationOverride(name = "productCompositionid.productDetails",
joinColumns = @JoinColumn(name = "childidproduct"))})
@Access(AccessType.PROPERTY)
public class ProductComposition {
@EmbeddedId
@Access(AccessType.FIELD)
ProductCompositionid productCompositionid = new ProductCompositionid();
private Double qty;
public ProductComposition() {
}
public ProductComposition(ProductCompositionid productCompositionid) {
this.productCompositionid = productCompositionid;
}
public ProductCompositionid getProductCompositionid() {
return productCompositionid;
}
public void setProductCompositionid(ProductCompositionid productCompositionid) {
this.productCompositionid = productCompositionid;
}
@Column(name = "qty")
public Double getQty() {
return qty;
}
public void setQty(Double qty) {
this.qty = qty;
}
@Transient
public Product getProductMaster() {
return getProductCompositionid().getProductMaster();
}
public void setProductMaster(Product productMaster) {
getProductCompositionid().setProductMaster(productMaster);
}
@Transient
public Product getProductDetails() {
return getProductCompositionid().getProductDetails();
}
public void setProductDetails(Product productDetails) {
getProductCompositionid().setProductDetails(productDetails);
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof ProductComposition)) {
return false;
}
ProductComposition that = (ProductComposition) o;
return
Objects.equals(this.productCompositionid, that.productCompositionid)
;
}
@Override
public int hashCode() {
return Objects.hash(productCompositionid, qty);
}
}
实体
import javax.persistence.*;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
@Entity
@Table(name = "Product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idproduct")
private Long idProduct;
@Column(name = "namefr")
private String nameFR;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "productCompositionid.productDetails", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Set<ProductComposition> detailsComposition = new HashSet<>();
@OneToMany(fetch = FetchType.EAGER, mappedBy = "productCompositionid.productMaster", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Set<ProductComposition> masterCompotion = new HashSet<>();
@Override
public String toString() {
return nameFR;
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Product)) {
return false;
}
Product that = (Product) o;
return idProduct == that.idProduct &&
Objects.equals(nameFR, that.nameFR)
;
}
@Override
public int hashCode() {
return Objects.hash(idProduct, nameFR
);
}
}
那么,实现这种情况的正确方法是什么。