Hibernate Mapping是否必要?

时间:2013-01-20 18:59:03

标签: java hibernate hibernate-mapping

我是Hibernate的新手,我下载了一个示例Java应用程序并将其修改为更有用,到目前为止,在我的应用程序中,我有两个在我的Java应用程序中定义的db类:Actor.java和City.java 它们中的每一个都有一个.hbm.xml文件,如下所示:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Jun 17, 2009 11:42:48 AM by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="sakila.entity.Actor" table="actor" catalog="sakila">
        <id name="actorId" type="java.lang.Short">
            <column name="actor_id" />
            <generator class="identity" />
        </id>
        <property name="firstName" type="string">
            <column name="first_name" length="45" not-null="true" />
        </property>
        <property name="lastName" type="string">
            <column name="last_name" length="45" not-null="true" />
        </property>
        <property name="lastUpdate" type="timestamp">
            <column name="last_update" length="19" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="sakila.entity.City" table="city" catalog="sakila">
        <id name="cityId" type="java.lang.Short">
            <column name="city_id" />
            <generator class="identity" />
        </id>
        <property name="city" type="string">
            <column name="city" length="45" not-null="true" />
        </property>
        <property name="countryId" type="string">
            <column name="country_Id" length="45" not-null="true" />
        </property>
        <property name="lastUpdate" type="timestamp">
            <column name="last_update" length="19" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

该应用程序到目前为止工作得很好。但我的问题是,如果我需要更改我的应用程序以便它可以处理db中的数百个对象(如Actor和City),我是否需要定义所有映射文件?如果我在编程用户可能查询的db对象时不知道怎么办,我是否需要定义所有这些,这似乎是不可能的,所以我的问题是:是否需要* .hbm.xml文件?在这种情况下,我需要编写一个应用程序,让用户查询他需要的任何对象,我甚至可能不知道数据库中的内容,如何编写这样的应用程序?可以使用Hibernate吗?

4 个答案:

答案 0 :(得分:4)

Frank * .hbm.xml文件不是必需的。 Hibernate注释是在不使用XML文件的情况下定义映射的最新方法。除了XML映射元数据之外,您还可以使用注释或替代XML映射元数据。在你的情况下,

@Entity
@Table(name ="actor")
public Class Actor
{
    @Column(name = "actor_id")
    private Short actorId;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "last_update")
    private Timestamp lastUpdate;
}

@Entity
@Table(name ="city")
public Class City
{
    @Column(name = "city_id")
    private Short cityId;

    @Column(name = "city")
    private String city;

    @Column(name = "country_Id")
    private String countryId;

    @Column(name = "last_update")
    private Timestamp lastUpdate;
}

Hibernate Annotation将元数据与POJO java文件结合在一起,这有助于用户在开发过程中同时理解表结构和POJO

答案 1 :(得分:1)

那么,您希望与Hibernate一起使用的数据库中的每个表都需要在应用程序端定义实体。您可以通过xml配置文件或注释来定义此实体(我强烈建议,它更“用户友好”)。所以它基本上是你需要维持的1:1关系。

答案 2 :(得分:1)

如果您的系统非常动态,以至于您不知道用户将要查询的表,那么我无法看到您将这些表映射到相应的POJO的方式。 Hibernate的主要重点是将模式中的表映射到Java应用程序中的对象,主要是通过Hibernate查询语言(HQL)或其中一个可用的编程API。

但是,可以在hibernate中使用直接SQL并返回非托管对象,尽管这比使用HQL或查询API在功能上要局限得多。为此,您将使用类似于以下内容的代码:

createSQLQuery( "SELECT * FROM someTable" ).addTransformer(Transformers.aliasToBean(MyJavaClass.class));

此转换器按名称将SQL查询中的列映射到指定POJO的属性。在实践中,类型转换具有挑战性,并且在许多情况下需要.setScalar。您还可以使用Transformers.aliasToEntityMap返回一个地图列表,其中每个地图都是列名与值的映射。

简要介绍了当前Hibernate Core文档的第18.1.5节。

答案 3 :(得分:1)

如果您需要查询数据库,我假设您将知道要查找的表。 Netbeans会自动为我们创建所有.hbm和.java文件。查看链接 - http://netbeans.org/kb/docs/web/hibernate-webapp.html#05