2012-02-25 21 views
7

Mam ogólne pytanie o Hibernate, z którym walczę.Kaskada Hibernacji PERSISTA

mam klasy A i klasy B, gdzie B jest zależna od

W moim kodu gdy zgłoszę em.persist (objOfTypeA) spodziewałbym wkładka iść i wstawić do obu tabel AAA i BBB. Jeśli ręcznie narysuję identyfikator A i wypełnię go na liście dla każdego obiektu, a następnie utrzymuję tę listę, wszystko działa. Ale spodziewam się, że to się stanie magicznie przez Hibernate.

Czy robię coś nie tak? A może po prostu oczekuję zbyt dużo Hibernacji?

Dzięki

@Entity 
@Table(name = "AAA") 
@Veto 
public class A { 

    @Id 
    @GeneratedValue 
    @Column(name = "Id") 
    private Long id; 


    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    ... 

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
    private List<B> b; 
... 
} 

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId") 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false) 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

Odpowiedz

1

W końcu to rozwiązałem. Żaden z przykładów Dostałam lub znajdując powiedział mi dokładnie, co się stało, dopiero po moim eksperymentowania, że ​​udało mi się dojść do tego wniosku:

Zamiast

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
private List<B> b; 

że nie zrobił” t pracy (FK wciąż przychodzi jako NULL)

ten wyszło:

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
@JoinColumn(name="AId") 
@NotNull 
private List<B> b; 
+0

To nie działa dla mnie. Problem polega na tym, że Hibernate chce, aby A było ustawione na B przed kontynuowaniem. To zadziałało: http://stackoverflow.com/questions/1795649/jpa-persisting-a-one-to-many-relationship –

0

Modyfikowanie mapowania klasy B jak poniżej,

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId", updatable = false, insertable = false) 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id") 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

uzywasz atrybuty updatable = false, insertable = false w niewłaściwym miejscu i ja to skorygowane.

Przeczytaj here, aby zrozumieć, jak działają.

+0

Hi ManuPK, Dzięki za odpowiedź, ale to nie rozwiązało mojego problemu. Podczas próby utrzymania (A) pojawia się błąd, który oznacza, że ​​dla B jest pusty. ConstraintViolationImpl {interpolatedMessage = 'nie może być null', propertyPath = pomoc, rootBeanClass = klasa com.test.model.B, messageTemplate = '{javax.validation.constraints.NotNull.message}'} nie jestem pewien jeśli po stronie SQL Server muszę mieć oba identyfikatory (A i B) jako tożsamość lub czy Hibernate zajmie się tym? Ale zakładam, że jest w porządku, ponieważ nie narzeka, że ​​narzeka na FK. – WonkeyDonkey

+0

DB wygląda tak: Tabela 1: AAA Id bigint not null, Nazwa varchar (100) Tabela 2: BBB Id bigint not null, pomoc bigint not null, Nazwa varchar (100) Dzięki! – WonkeyDonkey

+0

Powróciłem do DB i usunąłem "not null" z AId, a także @NotNull z aId w klasie B. Teraz persist jest udany Ale kiedy patrzę na DB. AAA jest dobre, ale BBB brakuje AId. Pomoc .. – WonkeyDonkey