У меня есть кейс, который реализует самостоятельное соединение многих со многими со столбцами 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);
}
}
Entity
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
);
}
}
Итак, как правильно реализовать такой сценарий.