2012-02-25 17 views
7

Ho una domanda generale su Hibernate con la quale sto combattendo.Hibernate Cascade PERSIST

devo di classe A e di classe B, dove B è dipendente da un

Nel mio codice quando chiamo em.persist (objOfTypeA) mi aspetterei l'inserto di andare e inserire in entrambe le tabelle AAA e BBB. Se presagisco manualmente A ottengo l'ID di A e lo compilo nella lista per ogni oggetto e poi continuo quell'elenco, le cose stanno funzionando. Ma mi aspetto che questo accada magicamente da Hibernate.

Sto facendo qualcosa di sbagliato? O mi sto solo aspettando troppo da Hibernate?

Grazie

@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; 
...  
} 

risposta

1

Ho finalmente risolto. Nessuno degli esempi mi è stata data o trovato mi ha detto esattamente che cosa era sbagliato, è stato solo dopo la mia sperimentazione che sono riuscito a venire a questa conclusione:

Invece di avere

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

che didn' t lavoro (FK era ancora venuta come NULL)

Questo ha funzionato:

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

Questo non ha funzionato per me. Il problema è che Hibernate vuole che A sia impostato su B prima di persistere. Questo ha funzionato: http://stackoverflow.com/questions/1795649/jpa-persisting-a-one-to-many-relationship –

0

Modificare la mappatura di classe B come qui di seguito,

@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; 
...  
} 

si stava utilizzando gli attributi updatable = false, insertable = false al posto sbagliato e ho corretto esso.

Leggi here per capire come funzionano.

+0

Hi ManuPK, Grazie per la tua rispondi, ma questo non ha risolto il mio problema. Durante il tentativo di persistere (A), viene visualizzato un errore che AID per B è nullo. ConstraintViolationImpl {interpolatedMessage = 'non può essere null', propertyPath = Aid, rootBeanClass = classe com.test.model.B, messageTemplate = '{} javax.validation.constraints.NotNull.message'} Non sono sicuro se sul lato SQL Server devo avere entrambi gli id ​​(A e B) come identità o Hibernate si prenderà cura di questo? Ma suppongo che sia ok perché non si lamenta perché si lamenta con l'FK. – WonkeyDonkey

+0

DB sta cercando in questo modo: Tabella 1: AAA Id bigint non null, Nome varchar (100) Table2: BBB Id bigint non null, Aid bigint non null, Nome varchar (100) Grazie! – WonkeyDonkey

+0

Sono tornato al DB e rimosso 'not null' da AId e anche da @NotNull da un ID in classe B. Ora la persistenza ha successo Ma quando guardo il DB. AAA va tutto bene, ma a BBB manca l'AId. Help .. – WonkeyDonkey

Problemi correlati