您的位置:首页 > 其它

Hibernate关系映射

2009-09-28 22:47 113 查看
Hibernate关系映射1对1one-to-one: 1对1的关系在现实中很常见。比方说:人和身份证。1个身份证对应着一个身份证,一个身份证对应着一个人。那么,我们就以此为原型。进行代码编写。 建立实体模型如右:
根据模型,创建数据库:
    useHibernateQuickUse;
droptableifexistsPerson;
droptableifexistsCard;
createtableCard(
idvarchar(32)primarykey,
cardDescvarchar(128)notnull
);
createtablePerson(
idvarchar(32)primarykey,
namevarchar(32)notnull,
card_idvarchar(32)notnull,
foreignkey(card_id)referencesCard(id)
);
Java代码如下: Person类
   packageorg.py.hib.relation.one2one;
/**
*Personentity.
*/
@SuppressWarnings("serial")
publicclassPersonimplementsjava.io.Serializable
{
privateStringid;
privateStringname;
privateCardcard;
publicPerson()
{
}
publicStringgetId()
{
returnthis.id;
}
publicvoidsetId(Stringid)
{
this.id=id;
}
publicCardgetCard()
{
returnthis.card;
}
publicvoidsetCard(Cardcard)
{
this.card=card;
}
publicStringgetName()
{
returnthis.name;
}
publicvoidsetName(Stringname)
{
this.name=name;
}
}
Card类:
    packageorg.py.hib.relation.one2one;
/**
*Cardentity.
*/
@SuppressWarnings("serial")
publicclassCardimplementsjava.io.Serializable
{
privateStringid;
privateStringcardDesc;
publicCard()
{
}
publicStringgetId()
{
returnthis.id;
}
publicvoidsetId(Stringid)
{
this.id=id;
}
publicStringgetCardDesc()
{
returncardDesc;
}
publicvoidsetCardDesc(StringcardDesc)
{
this.cardDesc=cardDesc;
}
}
XML映射文件如下: Person.hbm.xml

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
cascade="all"column="card_id"/>
今天讲的是one-to-one配置。但是,此处用的是many-to-one,这个是什么原因呢?其实,one-to-one就是特殊的many-to-one。 Card.hbm.xml:
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
测试代码如下: One2OneTest.java
    packageorg.py.hib.relation.one2one;
importjunit.framework.Assert;importjunit.framework.TestCase;
importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.Transaction;importorg.hibernate.cfg.Configuration;importorg.junit.After;importorg.junit.Before;
publicclassOne2OneTestextendsTestCase{privateSessionFactoryfactory;
privateStringm_name="ryanpoy";
privateStringm_name2="ryanpoy2";
privateStringm_cardDesc1="desc_1";
privateStringm_cardDesc2="desc_2";
@BeforepublicvoidsetUp()throwsException{Configurationconf=newConfiguration().configure();factory=conf.buildSessionFactory();}
/***测试添加*@throwsException*/publicvoidtestSave()throwsException{System.out.println("/n===testsave===");
Cardcard=newCard();card.setCardDesc(m_cardDesc1);
Personperson=newPerson();person.setName(m_name);//设置用户名=m_nameperson.setCard(card);
Sessionsession=null;Transactiontran=null;try{session=factory.openSession();tran=session.beginTransaction();session.save(person);
tran.commit();
Assert.assertEquals(person.getId()!=null,true);Assert.assertEquals(card.getId()!=null,true);
}catch(Exceptionex){tran.rollback();throwex;}finally{if(session!=null){try{session.close();}catch(Exceptionex){//nothingtodo}finally{if(session!=null)session=null;}}}}
/***测试查询*@throwsException*/publicvoidtestFind()throwsException{System.out.println("/n===testfind===");Sessionsession=null;try{session=factory.openSession();Personperson=(Person)session.createQuery("fromPerson").list().get(0);
Assert.assertEquals(true,person.getId()!=null);Assert.assertEquals(m_name,person.getName());
Assert.assertEquals(true,person.getCard().getId()!=null);Assert.assertEquals(m_cardDesc1,person.getCard().getCardDesc());
}catch(Exceptionex){throwex;}finally{if(session!=null){try{session.close();}catch(Exceptionex){//nothingtodo}finally{if(session!=null)session=null;}}}}
/***测试修改*@throwsException*/publicvoidtestModify()throwsException{System.out.println("/n===testmodify===");Sessionsession=null;Transactiontran=null;try{session=factory.openSession();tran=session.beginTransaction();
Personperson=(Person)session.createQuery("fromPerson").list().get(0);person.setName(m_name2);//修改用户名=m_name2.(原来用户名=m_name)person.getCard().setCardDesc(m_cardDesc2);//修改cardDesc为m_cardDesc2(原来是:m_cardDesc1)tran.commit();
}catch(Exceptionex){throwex;}finally{if(session!=null){try{session.close();}catch(Exceptionex){//nothingtodo}finally{if(session!=null)session=null;}}}
/**修改后再查询*/System.out.println("/n===testfindaftermodify===");try{session=factory.openSession();Personperson=(Person)session.createQuery("fromPerson").list().get(0);
Assert.assertEquals(true,person.getId()!=null);Assert.assertEquals(m_name2,person.getName());
Assert.assertEquals(true,person.getCard().getId()!=null);Assert.assertEquals(m_cardDesc2,person.getCard().getCardDesc());
}catch(Exceptionex){throwex;}finally{if(session!=null){try{session.close();}catch(Exceptionex){//nothingtodo}finally{if(session!=null)session=null;}}}}
/***测试删除*@throwsException*/publicvoidtestDelete()throwsException{System.out.println("/n===testdelete===");Sessionsession=null;Transactiontran=null;try{session=factory.openSession();tran=session.beginTransaction();
Personperson=(Person)session.createQuery("fromPerson").list().get(0);session.delete(person);tran.commit();
}catch(Exceptionex){throwex;}finally{if(session!=null){try{session.close();}catch(Exceptionex){//nothingtodo}finally{if(session!=null)session=null;}}}
/**删除后再查询*/System.out.println("/n===testfindafterdelete===");try{session=factory.openSession();
Integernum=(Integer)session.createQuery("fromPerson").list().size();Assert.assertEquals(0,num.intValue());
num=(Integer)session.createQuery("fromCard").list().size();Assert.assertEquals(0,num.intValue());
}catch(Exceptionex){throwex;}finally{if(session!=null){try{session.close();}catch(Exceptionex){//nothingtodo}finally{if(session!=null)session=null;}}}}
/****/@AfterpublicvoidtearDown()throwsException{factory.close();}
}
运行test,测试成功. 在Hibernateone-to-one关系映射中,其实还有一种方式,即:唯一主见关联。但是,我一直倾向于上面的这种形式,所以,唯一主见关联的旧部介绍了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: