2013-01-20 103 views
1

我是Hibernate的新手,我下載了一個示例Java應用程序,並將其修改爲更加有用,到目前爲止,在我的應用程序中,我有兩個在我的Java應用程序中定義的db類:Actor.java和City.java 他們有一個文件的.hbm.xml如下所示:需要Hibernate映射嗎?

<?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可用嗎?

回答

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節中有簡要介紹。

1

那麼,您希望與Hibernate一起使用的數據庫中的每個表都需要在應用程序端定義實體。你可以通過xml配置文件或註釋來定義這個實體(我強烈建議,它更加「用戶友好」)。所以它基本上是你需要維護的1:1關係。

3

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的註解俱樂部的元數據與該代碼沿POJO的java文件可以幫助用戶開發

+0

謝謝你解決 –