`
java-mans
  • 浏览: 11435170 次
文章分类
社区版块
存档分类
最新评论

hibernate中的多对一关联关系

 
阅读更多

前面已经说过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();  //关闭连接,否则会把数据库卡死
    		}
    	}
    	
    }
}

看一下运行效果图

控制台的输出如图所示

到这里代码就结束了,如果对代码有疑问可以给我评论,我会为大家一一解答。






分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics