【问题标题】:Hibernate Mapping necessary?需要休眠映射吗?
【发布时间】:2013-01-20 18:59:02
【问题描述】:

我是 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 文件是否必要?如果我需要编写一个应用程序,让用户查询他需要的任何对象,我什至可能不知道数据库中有什么,如何编写这样的应用程序?可以用 Hibernate 吗?

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      如果您的系统非常动态,以至于您不知道用户将要查询的表,那么我看不到您将如何将这些表映射到相应的 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】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-13
            • 1970-01-01
            相关资源
            最近更新 更多