Hibernate generyczny composite key i zapisywanie kaskadowe.

0

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:

  1. Czy to podejście jest poprawne? Czy może lepiej tworzyć osobne klucze kompozytowe dla każdej tabeli która tego wymaga?
  2. Jeśli jest poprawne, to w jaki sposób przenieść adnotacje @OneToMany do klasy TestClass?
  3. 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.

0

Szczerze powiedziawszy jeszcze nie spotkałem się z przypadkiem aby mieć relacje w composite id.

Może to moje spaczenie ale zawsze staram się trzymać wieśniacko prostego: @Id @GeneratedValue Long id;

Jeżeli nie masz jakiś szczególnych wymagań może lepiej iść tą drogą a unikalność załatwić dzięki @UniqueConstraint ?

(^ zgodnie z zasadą: gorsze jest lepsze jeżeli znacznie upraszcza system ;) )

1 użytkowników online, w tym zalogowanych: 0, gości: 1