2017-08-04 155 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(运行时),这意味着注释应该可用于在运行时反射。

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

为什么反射慢?

每一步都经过反思验证。

例如,当你调用一个方法时,它需要检查目标是否实际上是方法声明器的一个实例,是否有合适数量的参数,每个参数是否是正确的类型等

注释是基于反思。