前面已经说过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(); //关闭连接,否则会把数据库卡死
}
}
}
}
看一下运行效果图
控制台的输出如图所示
到这里代码就结束了,如果对代码有疑问可以给我评论,我会为大家一一解答。