前面已经说过hibernate可以用处理阻抗不匹配的问题,按照这个说法,数据库里面的关联关系在hibernate中也可以体现出来,常用的关联关系有“多对一”,“一对多”,“一对一”,“多对多”,多对一关系在应用中还是比较多的。这篇文章主要介绍多对一关系的使用。hibernate的开发环境在我的文章中已经讲过了,这里就不细说了。多对一一般用来描述的是外键关系。例如许多文章对应一个作者,许多员工属于某个部门。基于这样的关系,我们会在从表里设一个外键来表示他们的关系。这就是我们所说的“多对一”。下面就来写一个文章和作者的例子演示一下。
1.写2个vo类,代码如下
package org.lxh.vo;
public class Author {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package org.lxh.vo;
public class Article {
private int id;
private String name;
private Author author;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
}
2.编写hibernate的隐射文件,代码如下
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.test.annotations"> <class name="org.lxh.vo.Author" table="author"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="name" column="name"/> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.hibernate.test.annotations"> <class name="org.lxh.vo.Article" table="article"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="name" column="name"/> <many-to-one name="author" column="author_id"/> <!-- 这里的author就是Article里的那个 --> </class> </hibernate-mapping>
3.配置文件写好了,现在来做个单元测试。代码如下
package org.lxh.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.BeforeClass; import org.lxh.vo.Article; import org.lxh.vo.Author; import util.HibernateUtil; public class Test { @BeforeClass public static void setUpBeforeClass() throws Exception { } @org.junit.Test public void save(){ Session ses=null; Transaction tr=null; try{ ses=HibernateUtil.getSession(); tr=ses.beginTransaction(); Author author=new Author(); author.setName("chenwill4"); Article article=new Article(); article.setAuthor(author); //建立2个对象的关联 article.setName("老鹰抓小鸡3"); ses.save(author); //将author信息保存 ses.save(article); tr.commit(); //将事务提交,否侧数据不会被保存 }catch(Exception e){ e.printStackTrace(); }finally{ if(ses!=null){ ses.close(); //关闭连接,否则会把数据库卡死 } } } @org.junit.Test public void queryByAuthor(){ Session ses=null; Transaction tr=null; try{ ses=HibernateUtil.getSession(); tr=ses.beginTransaction(); Article art=(Article)ses.get(Article.class, 3); System.out.println("作者的姓名是:"+art.getAuthor().getName()); //通过文章查询作者 tr.commit(); //将事务提交 }catch(Exception e){ e.printStackTrace(); }finally{ if(ses!=null){ ses.close(); //关闭连接,否则会把数据库卡死 } } } }