Hibernate注释映射比hbm.xml映射花费更多时间

时间:2017-08-04 06:21:02

标签: java performance hibernate jpa hibernate-annotations

我知道这很奇怪,但我遇到了这个问题。 我有一个简单的pojo类并使用struts + hibernate,我通过JPA更新oracle表。我使用的唯一棘手的事情是oracle序列 在每个插入查询之前调用。

但是当我使用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 个答案:

答案 0 :(得分:1)

首先,我们需要了解注释的工作原理。

示例 -

@GenericGenerator的定义

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

应用的注释是@Retention(RUNTIME),这意味着注释应该可以在运行时进行反射。

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

为什么反思很慢?

当您进行反思时,每一步都会得到验证。

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

注释基于反射。