2017-08-04 128 views
0

我知道它的奇怪,但我有這個問題。 我有一個簡單的pojo類,並使用struts + hibernate,我正在通過JPA更新一個oracle表。我使用的唯一棘手的事情是在每個插入查詢之前調用的oracle序列。Hibernate註解映射比hbm.xml映射需要更多的時間

但是,當我使用hbm.xml文件時,它給出的結果與註釋映射相比非常快。我想切換到註釋,任何人都可以知道可能的原因。

hbm.xml文件中是類似的東西

<?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> 

標註對應的文件上面的xml文件

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

回答

1

首先,我們需要了解註釋的工作。

實施例 -

的@GenericGenerator

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

所施加的註解的定義是@Retention(運行時),這意味着註釋應該可用於在運行時反射。

註解使用反射和反射很慢。

爲什麼反射慢?

每一步都經過反思驗證。

例如,當你調用一個方法時,它需要檢查目標是否實際上是方法聲明器的一個實例,是否有合適數量的參數,每個參數是否是正確的類型等

註釋是基於反思。