2017-08-04 3 views
0

Ich weiß es seltsam, aber ich habe dieses Problem. Ich habe eine einfache Pojo-Klasse und mit Struts + Hibernate, ich aktualisiere eine Oracle-Tabelle durch JPA. Die einzige knifflige Sache, die ich benutze, ist Orakel-Sequenz, die vor jeder Einfüge-Abfrage aufgerufen wird.Hibernate Annotation Mapping dauert länger als hbm.xml Mapping

Aber wenn ich hbm.xml-Datei verwenden, gibt es Ergebnis sehr schnell im Vergleich zu Annotation Mapping. Ich möchte zur Annotation wechseln, kann jemand eine Idee haben, was die Ursache sein kann.

hbm.xml Datei ist so etwas wie diese

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > 

<hibernate-mapping> 
    <class name="com.myproject.VersionSequence" 
      table="Version_Sequence" 
      dynamic-update="true"> 

     <meta attribute="sync-DAO">false</meta> 

     <id name="id" column="ID" type="java.lang.Long"> 
      <generator class="sequence"> 
       <param name="sequence">Oracle_Sequence</param> 
      </generator> 
     </id> 

     <property name="version" column="VERSION" type="java.lang.Long" not-null="true" /> 
     . 
     . 
     . 
     . 

    </class>  
</hibernate-mapping> 

Annotation entspricht Datei für über XML-Datei

@Entity 
@Table(name="Version_Sequence") 
public class VersionSequence implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(generator = "Oracle_Sequence") 
    @GenericGenerator(name = "Oracle_Sequence", 
     strategy = "sequence-identity", 
     parameters = { @Parameter(name = "sequence", value = "Oracle_Sequence") }) 
    @Column(name = "ID") 
    private Long id; 


    @Column(name = "VERSION") 
    private Long version; 
    . 
    . 
    . 

    // getter/seeters 
} 

Antwort

1

Zuerst haben wir die Bearbeitung von Annotation verstehen müssen.

Beispiel -

Die Definition von @GenericGenerator

http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate-core/4.3.2.Final/org/hibernate/annotations/GenericGenerator.java

Die angelegte Anmerkung wird @Retention (runtime), die Annotation bedeutet sollte für die Reflexion zur Laufzeit verfügbar sein.

Anmerkung verwendet Reflexion und Reflexion ist langsam.

Warum ist die Reflexion langsam?

Jeder Schritt wird validiert, wenn Sie Reflektion aufnehmen.

Wenn Sie beispielsweise eine Methode aufrufen, muss überprüft werden, ob das Ziel tatsächlich eine Instanz des Deklarators der Methode ist, ob Sie die richtige Anzahl von Argumenten haben, ob jedes Argument vom richtigen Typ ist usw.

Anmerkungen basieren auf Reflektion.