Witam,
Mam problem z napisaniem klasy generycznej dla kluczy kompozytowych. Wszystkie tabele które używają tego klucza mają relacje ManyToOne i 2 FK, więc napisałem taką oto klasę:
import java.io.Serializable;
import javax.persistence.Embeddable;
import javax.persistence.ManyToOne;
@Embeddable
public class CompositeKey<K, T> implements Serializable {
@ManyToOne
K firstKey;
@ManyToOne
T secondKey;
public CompositeKey() {
}
public CompositeKey(K firstKey, T secondKey) {
this.firstKey = firstKey;
this.secondKey = secondKey;
}
public K getFirstKey() {
return firstKey;
}
public void setFirstKey(K firstKey) {
this.firstKey = firstKey;
}
public T getSecondKey() {
return secondKey;
}
public void setSecondKey(T secondKey) {
this.secondKey = secondKey;
}
@Override
public String toString() {
return "CompositeKey [firstKey=" + firstKey + ", secondKey="
+ secondKey + "]";
}
@Override
public int hashCode() {
/* HashCode implementation */
}
@Override
public boolean equals(Object obj) {
/*Equals implementation */
}
}
Przykład użycia:
import javax.persistence.AssociationOverride;
import javax.persistence.AssociationOverrides;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
@Entity
public class TestClass {
@EmbeddedId
@AssociationOverrides({
@AssociationOverride(name = "firstKey", joinColumns = @JoinColumn(name = "FirstTable")),
@AssociationOverride(name = "secondKey", joinColumns = @JoinColumn(name = "SecondTable")) })
private CompositeKey<A, B> compositeKey;
@Lob
private String description;
/* Getters and Setters */
}
Pytania:
- Czy to podejście jest poprawne? Czy może lepiej tworzyć osobne klucze kompozytowe dla każdej tabeli która tego wymaga?
- Jeśli jest poprawne, to w jaki sposób przenieść adnotacje @OneToMany do klasy TestClass?
- Czy da się w tym przypadku użyć kaskady? Chciałbym żeby podczas zapisu klasy TestClass do bazy, zapisywane były również obiekty znajdujące się w kluczu kompozytowym.
Z góry dzięki za odpowiedzi.