Hibernacja, automatycznie utrzymuj zależne obiekty

Jestem całkiem nowy w Hibernate i staram się określić, co zrobi dla ciebie i czego wymaga od ciebie.

Dużym problemem jest obiekt, który ma zależności, które jeszcze nie istnieją w bazie danych. Na przykład mam obiekt projektu zawierający pole Producent, które akceptuje obiekt producenta jako jego wartość. W bazie danych mam tabelę produktów z kolumną mfr_id, która jest odwołaniem do tabeli producentów (dość typowa jednokierunkowa relacja jeden do wielu).

Jeśli producent przypisany do obiektu produktu odnosi się do tego, który jest już w bazie danych, nie ma problemu. Jednak gdy próbuję zapisać lub zaktualizować obiekt, który odwołuje się do producenta, który nie został jeszcze utrwalony, operacja kończy się niepowodzeniem z wyjątkiem.

Wyjątek w wątku „Aplikacja” org.hibernate.TransientObjectException: obiekt odwołuje się do niezapisanej instancji przejściowej - zapisz instancję przejściową przed opróżnieniem

Mogę oczywiście ręcznie sprawdzić stan producenta produktu, sprawdzając, czy jego pole ID ma wartość null i zapisuje go, jeśli tak, ale wygląda to na kłopotliwe rozwiązanie. Czy Hibernate obsługuje automatycznie utrzymujące się osoby zależne, jeśli dany zależny nie jest jeszcze trwały? Jeśli tak, jak mogę włączyć to zachowanie? Używam wersji Hibernate dołączonej do Netbeans (3.5, jak sądzę) i wbudowanych adnotacji do określania zachowania mapowania. Poniżej znajdują się moje klasy produktów i producentów, ograniczone do części, które obsługują zależność. (Produkt rozszerza Sellable, który mapuje do tabeli nadającej się do sprzedaży, używając JOINED jako strategii dziedziczenia Jest to ta tabela, która zawiera klucz podstawowy identyfikujący produkt)

@Entity
@Table (
        name="products",
        schema="sellable"
)
public abstract class Product extends Sellable {
    private Manufacturer                        manufacturer;

    @ManyToOne (fetch = FetchType.EAGER)
    @JoinColumn (name = "mfr_id")
    public Manufacturer getManufacturer () {
        return this.manufacturer;
    }

    /**
     * 
     * @param manufacturer 
     */
    public Product setManufacturer (Manufacturer manufacturer) {
        this.manufacturer   = manufacturer;
        return this;
    }
}

Zależny producent

@Entity
@Table (
        name="manufacturers",
        schema="sellable",
        uniqueConstraints = @UniqueConstraint(columnNames="mfr_name") 
)
public class Manufacturer implements Serializable {
    private Integer         mfrId       = null;
    private String          mfrName     = null;

    @Id
    @SequenceGenerator (name = "manufacturers_mfr_id_seq", sequenceName = "sellable.manufacturers_mfr_id_seq", allocationSize = 1)
    @GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "manufacturers_mfr_id_seq")
    @Column (name="mfr_id", unique=true, nullable=false)
    public Integer getMfrId () {
        return mfrId;
    }

    private Manufacturer setMfrId (Integer mfrId) {
        this.mfrId  = mfrId;
        return this;
    }

    @Column(name="mfr_name", unique=true, nullable=false, length=127)
    public String getMfrName () {
        return mfrName;
    }

    public Manufacturer setMfrName (String mfrName) {
        this.mfrName = mfrName;
        return this;
    }
}

AKTUALIZACJA: Próbowałem następujących elementówto pytanie, ale wciąż otrzymuję wyjątek obiektu przejściowego.

@ManyToOne (fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})

Sprawdziłem też, jaka wersja Hibernate jest dołączona do Netbeans, to 3.2.5

AKTUALIZACJA 2: Odkryłem, że poniższe wydaje się działać tak, jak chciałem.

@ManyToOne (fetch = FetchType.EAGER, cascade = CascadeType.ALL)

Podejrzewam jednak, że nie jest to typ kaskadowy, którego naprawdę chcę. Jeśli usunę produkt, nie sądzę, aby usunięcie powiązanego z nim producenta było właściwym działaniem, co według mnie nastąpi teraz.

Próbowałem utworzyć typ kaskady, który składał się ze wszystkich dostępnych typów, ale to też nie zadziałało. Otrzymałem ten sam wyjątek, gdy próbowałem zapisać produkt, z którym związany był niezapisany producent.

@ManyToOne (fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})

Widziałem CascadeType.SAVE_UPDATE wspomniany w kilku miejscach, ale ten tryb nie wydaje się być dostępny w wersji Hibernate pochodzącej z Netbeans.

questionAnswers(1)

yourAnswerToTheQuestion