1

我是 Hibernate 的新手,我下载了一个示例 Java 应用程序并将其修改为更有用,到目前为止,在我的应用程序中,我有两个在我的 Java 应用程序中定义的数据库类: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>

到目前为止,该应用程序运行良好。但我的问题是,如果我需要更改我的应用程序以便它可以处理数据库中的数百个对象,如 Actor 和 City,我是否需要定义所有映射文件?如果我在编程时不知道用户可能会查询哪些数据库对象,我是否需要定义所有这些对象,这似乎是不可能的,所以我的问题是:*.hbm.xml 文件是否必要?如果我需要编写一个应用程序,让用户查询他需要的任何对象,我什至可能不知道数据库中有什么,如何编写这样的应用程序?可以用休眠吗?

4

4 回答 4

8

Frank *.hbm.xml 文件不是必需的。Hibernate 注释是在不使用 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

于 2013-01-21T05:03:12.380 回答
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 节简要介绍了这一点。

于 2013-01-21T03:23:35.123 回答
1

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

于 2013-01-21T06:00:01.547 回答
1

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

于 2013-01-20T19:13:01.663 回答