2009-03-31 10 views
37

E 'una cattiva idea di utilizzare le annotazioni dal pacchetto javax.persistenceorg.hibernate.annotations vs. javax.persistence

invece di utilizzare il

annotazioni org.hibernate.annotations

Conosco che l'utilizzo di javax.peristence introduce ancora un'altra dipendenza. Ma se lo ignoro, quali sono i pro/contro?

risposta

55

Abbastanza l'oppsite.

Hibernate è un'implementazione dell'API Java Persistence e, laddove possibile, è necessario utilizzare le annotazioni standard (in javax.persistence). In questo modo, potresti teoricamente eseguire il tuo codice su altre implementazioni JPA.

Solo quando è necessaria la funzionalità specifica di ibernazione, si dovrebbero utilizzare le annotazioni di ibernazione.

La dipendenza extra è solo sui file jar di interfaccia/annotazione JPA e molto leggera.

+1

per cui il suo possibile mescolare le annotazioni di questi pacchetti (javax.persistence & org.hibernate.annotations) withing un @Entity – Schildmeijer

+0

voi puoi usare le entità jpa quando vuoi lavorare con le funzioni di ibernazione.nella mia esperienza non puoi combinare jpa/hibernate tra tutte le tue entità. – dseibert

0

Ho usato l'annotazione javax.persistence e quando ho sostituito Tomcat 6.0 con Glass Fish, Tomcat 6.0 ha incluso un altro pacchetto javax.persistence che ha incasinato tutto. Non penso che sia una buona idea usare l'annotazione javax.persistence. Dio sa cosa diavolo è successo con Tomcat e javax.persistence!

+0

Questa risposta non è molto utile in quanto non descrive le condizioni del cambiamento, i sintomi esatti, né una possibile soluzione. Quali file sono cambiati, quali erano gli errori e quali erano i nuovi barattoli? –

3

altro cons in:

http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/

dove:

@OneToMany(fetch = FetchType.LAZY, 
    cascade = {CascadeType.PERSIST,CascadeType.MERGE }, 
    mappedBy = "stock") 
public Set<StockDailyRecord> getStockDailyRecords() { 
return this.stockDailyRecords; 
} 

e questo non funziona:

stockDailyRecords.setStock(stock);   
stock.getStockDailyRecords().add(stockDailyRecords); 

session.save(stock); 
session.getTransaction().commit(); 

come @OneToMany è da APP, si aspettava una cascata JPA - javax.persistence.CascadeType. Tuttavia, quando si salva con sessione di Hibernate, org.hibernate.engine.Cascade farà il seguente verifica ...

if (style.doCascade(action)) { 

e Hibernate Salva processo provocando un'azione ACTION_SAVE_UPDATE, ma l'APP passerà un ACTION_PERSIST e ACTION_MERGE, si non corrisponderà e causerà l'esecuzione non riuscita della cascata.

0

Ufficialmente consigliato per combinare annotazioni JPA e Hibernate in caso di impostazione di opzioni a cascata, vedere Hibernate docs. 2.4.7. Cascade. Se si utilizzano solo annotazioni JPA, in caso di mappatura unidirezionale (nessun campo di tipo Foo in Employer.java) si ottiene ancora "Impossibile salvare il Datore di lavoro transiente" nella sessione di chiamata. SalvaOrUpdate. Cure sta usando Hibernate in stile @Cascade con cascade = {...}:

class Foo { 
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @Cascade(org.hibernate.annotations.CascadeType.REPLICATE) 
    public Collection<Employer> getEmployers() 
... 
} 
Problemi correlati