2009-03-31 2 views
37

Ist es eine schlechte Idee, die Anmerkungen aus demorg.hibernate.annotations vs. javax.persistence

javax.persistence Paket

anstelle der Verwendung des

zu verwenden org.hibernate.annotations Anmerkungen

Ich weiß dass die Verwendung von javax.peristence eine weitere Abhängigkeit einführt. Aber wenn ich das ignoriere, was sind die Vor-/Nachteile?

Antwort

55

Ziemlich die Oppsite.

Hibernate ist eine Implementierung der Java Persistence API. Wenn möglich, sollten Sie die Standardanmerkungen (in javax.persistence) verwenden. Auf diese Weise können Sie Ihren Code theoretisch auf anderen JPA-Implementierungen ausführen.

Nur wenn Sie Hibernate-spezifische Funktionen benötigen, sollten Sie die Hibernate-Annotationen verwenden.

Die zusätzliche Abhängigkeit ist nur auf die JPA-Schnittstelle/Annotation JAR-Dateien und sehr leicht.

+1

so seine mögliche Anmerkungen aus diesen Paketen zu mischen (javax.persistence & org.hibernate.annotations) withing eine @Entity – Schildmeijer

+0

Sie kann jpa-Entitäten verwenden, wenn Sie mit Hibernate-Funktionen arbeiten möchten.Meiner Erfahrung nach können Sie jpa/hibernate nicht unter all Ihren Entitäten kombinieren. – dseibert

0

Ich verwendete Annotation, und als ich Tomcat 6.0 durch meine Glasfische ersetzte, dann Tomcat 6.0 enthalten ein anderes javax.persistence-Paket, das alles vermasselt. Ich denke nicht, dass es eine gute Idee ist, Annotation zu verwenden. Gott weiß, was zur Hölle mit Tomcat und passiert ist!

+0

Diese Antwort ist nicht wirklich hilfreich, da sie nicht die Bedingungen der Änderung, die genauen Symptome oder eine mögliche Lösung beschreibt. Welche Dateien haben sich geändert, was waren die Fehler und was waren die neuen Gläser? –

3

andere Nachteile in:

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

wo:

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

und dies nicht funktionieren:

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

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

als @OneToMany von JPA ist, erwartet sie eine Kaskade JPA - javax.persistence.CascadeType. Allerdings, wenn Sie es mit Hibernate Session speichern, wird org.hibernate.engine.Cascade die folgende Überprüfung tun ...

if (style.doCascade(action)) { 

und speichern Prozess Hibernate eine ACTION_SAVE_UPDATE Aktion verursacht, aber die JPA eine ACTION_PERSIST und ACTION_MERGE passieren, es stimmt nicht überein und bewirkt, dass die Kaskade nicht ausgeführt werden konnte.

0

Offiziell empfohlen, JPA- und Hibernate-Annotationen zu mischen, wenn Kaskadierungsoptionen eingestellt werden, siehe Hibernate docs. 2.4.7. Cascade. Wenn Sie nur JPA-Annotationen verwenden, erhalten Sie bei unidirektionaler Zuordnung (kein Feld von Foo in Employer.java) in der Aufrufsitzung "SaveOrUpdate" immer noch "transient object Employer nicht speichern". Die Aushärtung wird mit Hibernate-Stil @Cascade zusammen mit Kaskade = {...}:

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