Hibernate學習之一對一關聯

          Posted on 2006-12-26 15:48 李鵬 閱讀(684) 評論(0)  編輯  收藏 所屬分類: hibernate

          今天練習了一下hibernate的一對一關聯(主鍵關聯),其實就是抄了一遍書上的例子。
          用的例子是《深入淺出hibernate》的一對一關聯例子,中國公民與護照形成的一對一主鍵關聯。
          代碼如下:

          數據庫使用的MSSQLServer2000,我已經導出SQL語句如下:
          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_TPassport_TUser]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
          ALTER TABLE [dbo].[TPassport] DROP CONSTRAINT FK_TPassport_TUser
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TPassport]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
          drop table [dbo].[TPassport]
          GO

          if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TUser]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
          drop table [dbo].[TUser]
          GO

          CREATE TABLE [dbo].[TPassport] (
           [id] [int] NOT NULL ,
           [serial] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
           [expiry] [int] NOT NULL
          ) ON [PRIMARY]
          GO

          CREATE TABLE [dbo].[TUser] (
           [id] [int] IDENTITY (1, 1) NOT NULL ,
           [name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
           [age] [int] NOT NULL ,
           [gender] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL
          ) ON [PRIMARY]
          GO

          ALTER TABLE [dbo].[TPassport] WITH NOCHECK ADD
           CONSTRAINT [PK_TPassport] PRIMARY KEY  CLUSTERED
           (
            [id]
           )  ON [PRIMARY]
          GO

          ALTER TABLE [dbo].[TUser] WITH NOCHECK ADD
           CONSTRAINT [PK_TUser] PRIMARY KEY  CLUSTERED
           (
            [id]
           )  ON [PRIMARY]
          GO

           CREATE  INDEX [F_TUser] ON [dbo].[TUser]([id]) ON [PRIMARY]
          GO

           CREATE  INDEX [FK_TUser] ON [dbo].[TUser]([id]) ON [PRIMARY]
          GO

          ALTER TABLE [dbo].[TPassport] ADD
           CONSTRAINT [FK_TPassport_TUser] FOREIGN KEY
           (
            [id]
           ) REFERENCES [dbo].[TUser] (
            [id]
           )
          GO

          復制以上代碼到查詢分析器,即可生成相應數據庫。呵呵

          然后就是POJO了,有兩個,分別是:
          eg.one2one.bean.TPassport;
          package eg.one2one.bean;

          import java.io.Serializable;

          public class TPassport implements Serializable {
           private static final long serialVersionUID = 1L;

           private Integer id;

           private String serial;

           private Integer expiry;

           private TUser user;

          /*
           *  省略的getter()和setter()
          **/
          }

          eg.one2one.bean.TUser;

          package eg.one2one.bean;

          import java.io.Serializable;

          public class TUser implements Serializable {

           private static final long serialVersionUID = 1L;

           private Integer id;

           private String name;

           private String gender;

           private Integer age;

           private TPassport passport;

          /*
           *  省略的getter()和setter()
          **/

          }

          接下來就應該書寫mapping文件了。
          TPassport.hbm.xml
          <hibernate-mapping>
            <class name="eg.one2one.bean.TPassport" table="TPassport">
              <id name="id" type="java.lang.Integer" column="id">
                <generator class="foreign">
                  <param name="property">user</param>
                </generator>
              </id>
              <one-to-one name="user"
                          class="eg.one2one.bean.TUser"
                          constrained="true"></one-to-one>
              <property name="serial" type="java.lang.String" column="serial"></property>
              <property name="expiry" type="java.lang.Integer" column="expiry"></property>
            </class>
          </hibernate-mapping>

          TUser.hbm.xml
          <hibernate-mapping>
            <class name="eg.one2one.bean.TUser" table="TUser">
              <id name="id" type="java.lang.Integer" column="id">
                <generator class="native">
                   <param name="property">passport</param>
                </generator>
              </id>
              <property name="name" type="java.lang.String" column="name"></property>
              <property name="gender" type="java.lang.String" column="gender"></property>
              <property name="age" type="java.lang.Integer" column="age"></property>
              <one-to-one name="passport"
                        class="eg.one2one.bean.TPassport"
                        cascade="all"
                        outer-join="true"></one-to-one>
            </class>
          </hibernate-mapping>


          哇,已經貼了這么多了,還沒完呢。配置文件內容如下:
          <session-factory>
           <property name="connection.username">yourusername</property>
           <property name="connection.url">
            jdbc:microsoft:sqlserver://127.0.0.1:1433;dataBaseName=Test
           </property>
           <property name="dialect">
            org.hibernate.dialect.SQLServerDialect
           </property>
           <property name="myeclipse.connection.profile">One2OneTest</property>
           <property name="connection.password">yourpassword</property>
           <property name="connection.driver_class">
            com.microsoft.jdbc.sqlserver.SQLServerDriver
           </property>
           <property name="show_sql">true</property>
           <mapping resource="eg/one2one/bean/TUser.hbm.xml" />
           <mapping resource="eg/one2one/bean/TPassport.hbm.xml" />

          </session-factory>

          Ok,好了。寫了這么多代碼,能不能執行,測試一下吧。
          package eg.one2one.util;

          import org.hibernate.SessionFactory;
          import org.hibernate.cfg.Configuration;

          public class HibernateUtil {
           private static SessionFactory sessionFactory;

           private HibernateUtil() {
           }

           public static SessionFactory getSessionFactory() {
            if (sessionFactory == null) {
             Configuration config = new Configuration();
             config.configure();
             sessionFactory = config.buildSessionFactory();
            }
            return sessionFactory;
           }
          }


          測試類:
          package eg.test;

          import java.util.Iterator;
          import java.util.List;

          import org.hibernate.HibernateException;
          import org.hibernate.Query;
          import org.hibernate.Session;
          import org.hibernate.SessionFactory;
          import org.hibernate.Transaction;

          import eg.one2one.bean.TPassport;
          import eg.one2one.bean.TUser;
          import eg.one2one.util.HibernateUtil;

          public class One2OneTest {
           public static void main(String[] args) {
            SessionFactory sessionFactory =
             HibernateUtil.getSessionFactory();
                  Session session = sessionFactory.openSession();
                 
                 
          /*        TUser user = (TUser) session.load(TUser.class, new Integer(1));
                 
                  Transaction trans = null;
                  try{
                   trans = session.beginTransaction();
                   session.delete(user);
                   trans.commit();
                  }catch(HibernateException e){
                   e.printStackTrace();
                   if(trans != null)
                    trans.rollback();
                  }*/

          /*        TUser user = (TUser) session.load(TUser.class, new Integer(2));
                 
                  user.setName("beauty");
                  user.setAge(new Integer(20));
                  user.setGender("femal");
                 
                  user.getPassport().setExpiry(new Integer(100));
                  user.getPassport().setSerial("Australian");
                 
                  Transaction trans = null;
                  try{
                   trans = session.beginTransaction();
                   session.save(user);
                   trans.commit();
                  }catch(HibernateException e){
                   e.printStackTrace();
                   if(trans != null)
                    trans.rollback();
                  }*/
                 
                 
          /*        Query query = session.createQuery("from TUser");       
                  List list = query.list();
                  Iterator it = list.iterator();
                  while(it.hasNext()){
                   TUser user = (TUser)it.next();
                   System.out.print(user.getId() + "\t");
                   System.out.print(user.getName() + "\t");
                   System.out.print(user.getGender() + "\t");
                   System.out.print(user.getAge() + "\t");
                   System.out.print(user.getPassport().getSerial() + "\t");
                   System.out.println(user.getPassport().getExpiry());
                  }*/
                 
                 
          /*        Query query = session.createQuery("from TPassport");
                  List list = query.list();
                  Iterator it = list.iterator();
                  while(it.hasNext()){
                   TPassport passport = (TPassport)it.next();
                   System.out.print(passport.getId() + "\t");
                   System.out.print(passport.getSerial() + "\t");
                   System.out.print(passport.getExpiry() + "\t");
                   System.out.print(passport.getUser().getName() + "\t");
                   System.out.print(passport.getUser().getGender() + "\t");
                   System.out.println(passport.getUser().getAge() + "\t");
                     
                  }*/
                 
          /*        TUser user = new TUser();
                  user.setName("wangwu");
                  user.setAge(new Integer(40));
                  user.setGender("male");
                 
                  TPassport passport = new TPassport();
                  passport.setSerial("American");
                  passport.setExpiry(new Integer(10));
                 
                  user.setPassport(passport);
                  passport.setUser(user);
                 
                  Transaction tran = null;
                  try{
                   tran = session.beginTransaction();         
                   session.save(user);         
                   tran.commit();
                  }catch(HibernateException e){
                      e.printStackTrace();
                      if(tran != null)
                       tran.rollback();
                  }*/
           }
          }

          完成了。


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          posts - 8, comments - 28, trackbacks - 0, articles - 0

          Copyright © 李鵬

          主站蜘蛛池模板: 那曲县| 成都市| 嘉善县| 神农架林区| 乐东| 巨鹿县| 鸡东县| 焦作市| 德州市| 天门市| 西平县| 常德市| 武宁县| 宁安市| 瓮安县| 来安县| 通海县| 辽中县| 米林县| 伊川县| 呼和浩特市| 天祝| 明光市| 宁城县| 寿宁县| 富民县| 道真| 页游| 上饶市| 黄浦区| 沐川县| 宜君县| 什邡市| 吉隆县| 遵义县| 饶平县| 南阳市| 康定县| 鄱阳县| 健康| 平武县|