Ich habe das folgende Domänenmodell
Währung ----< Preis >---- Produkt
Oder auf Englisch
Ein Produkt hat einen oder mehrere Preise. Jeder Preis ist in einer bestimmten Währung angegeben.
Preis
hat einen zusammengesetzten Primärschlüssel (dargestellt durch PricePK
unten), der aus den Fremdschlüsseln zu Währung
und Produkt
besteht. Die relevanten Abschnitte der mit JPA annotierten Java-Klassen sind unten aufgeführt (meist ohne Getter und Setter):
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Currency {
@Id
private Integer ix;
@Column
private String name;
@OneToMany(mappedBy = "pricePK.currency", cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
private Collection prices = new ArrayList();
}
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Product {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@OneToMany(mappedBy = "pricePK.product", cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
private Collection defaultPrices = new ArrayList();
}
@Embeddable
public class PricePK implements Serializable {
private Product product;
private Currency currency;
@ManyToOne(optional = false)
public Product getProduct() {
return product;
}
@ManyToOne(optional = false)
public Currency getCurrency() {
return currency;
}
}
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Price {
private PricePK pricePK = new PricePK();
private BigDecimal amount;
@Column(nullable = false)
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
@EmbeddedId
public PricePK getPricePK() {
return pricePK;
}
@Transient
public Product getProduct() {
return pricePK.getProduct();
}
public void setProduct(Product product) {
pricePK.setProduct(product);
}
@Transient
public Currency getCurrency() {
return pricePK.getCurrency();
}
public void setCurrency(Currency currency) {
pricePK.setCurrency(currency);
}
}
Wenn ich versuche, eine Instanz von Product
zu aktualisieren, erhalte ich einen StackOverflowError, daher vermute ich, dass es irgendeine Art von Zyklus (oder anderer Fehler) in der obigen Zuordnung gibt, kann jemand das erkennen?
0 Stimmen
+1, schön formulierte Frage. Ich bin jedoch neugierig auf das Domänenmodell. Es scheint merkwürdig, dass ein
Price
eindeutig durch dasProduct
+Currency
und nicht etwa durch seinen (skalaren) Wert +Currency
identifiziert wird.0 Stimmen
Danke Matt, es gibt auch ein
BigDecimal amount
Feld in derPrice
Klasse, aber ich habe es hier weggelassen, weil es für die Frage nicht relevant ist und ich die Codeliste so kurz wie möglich halten wollte.