2009-03-31 6 views
37

¿Es una mala idea utilizar las anotaciones del paquete javax.persistenceorg.hibernate.annotations vs. javax.persistence

lugar de utilizar el

org.hibernate.annotations anotaciones

Lo sé que usar javax.peristence introduce otra dependencia. Pero si ignoro eso, ¿cuáles son los pros/contras?

Respuesta

55

Bastante el oppsite.

Hibernate es una implementación de la API Java Persistence y, cuando sea posible, debe utilizar las anotaciones estándar (en javax.persistence). De esta forma, teóricamente podría ejecutar su código en otras implementaciones de JPA.

Solo cuando necesite la funcionalidad específica de Hibernate, debe usar las anotaciones de Hibernate.

La dependencia adicional solo se encuentra en los archivos jar de interfaz/anotación JPA y es muy ligera.

+1

por lo que su posible mezclar las anotaciones de estos paquetes (javax.persistence y org.hibernate.annotations) withing un @Entity – Schildmeijer

+0

se puede usar entidades jpa cuando desee trabajar con funciones de hibernación.en mi experiencia, no puedes mezclar jpa/hibernate entre todas tus entidades. – dseibert

0

Utilicé la anotación javax.persistence, y cuando reemplacé Tomcat 6.0 con mi Glass Fish, Tomcat 6.0 incluyó otro paquete javax.persistence que lo estropeó todo. No creo que sea una buena idea usar la anotación javax.persistence. ¡Dios sabe qué diablos pasó con Tomcat y javax.persistence!

+0

Esta respuesta no es de gran ayuda, ya que no describe las condiciones del cambio, los síntomas exactos ni una posible solución. ¿Qué archivos cambiaron, cuáles fueron los errores y cuáles fueron los nuevos tarros? –

3

Otro de los contras en:

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

donde:

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

y esto no funciona:

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

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

como @OneToMany es de APP, se espera una cascada JPA - javax.persistence.CascadeType. Sin embargo cuando se guarda con la sesión de Hibernate, org.hibernate.engine.Cascade hará lo siguiente comprobación ...

if (style.doCascade(action)) { 

e Hibernate Guardar proceso que causa una acción ACTION_SAVE_UPDATE, pero la APP pasará un ACTION_PERSIST y ACTION_MERGE, se no coincidirá y hará que la cascada no se ejecute.

0

Oficialmente se recomienda mezclar las anotaciones JPA e Hibernate en el caso de establecer opciones en cascada, ver Hibernate docs. 2.4.7. Cascade. Si usa solo anotaciones JPA, en caso de mapeo unidireccional (ningún campo de Foo escriba en Employer.java) aún obtiene "no se puede guardar el objeto transitorio Employer" en la sesión call.SaveOrUpdate. Cure está utilizando hibernación de estilo en cascada @Cascade junto con = {...}:

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