Hibernate之集合映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate之集合映射相关的知识,希望对你有一定的参考价值。

一 List映射

如果持久化类中具有List对象,可以通过映射文件中的类<list>元素或注解来映射List.

例如,一个问题有多个答案:

 

技术分享

1)创建持久化类

package list;

import java.util.List;

public class Question {
	
	private int id;
	
	private String qname;
	
	private List<String> answers;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getQname() {
		return qname;
	}

	public void setQname(String qname) {
		this.qname = qname;
	}

	public List<String> getAnswers() {
		return answers;
	}

	public void setAnswers(List<String> answers) {
		this.answers = answers;
	}
	
	

}

2)创建映射文件

<?xml version=‘1.0‘ encoding=‘UTF-8‘?>  
<!DOCTYPE hibernate-mapping PUBLIC  
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

 <hibernate-mapping>  
  <class name="list.Question" table="quesion">  
  	 <cache usage="read-write"/>
    <id name="id">  
     <generator class="increment"></generator>  
    </id>  
    <property name="qname"></property> 
    <list name="answers" table="answers">
    	<key column="qid"></key>
    	<index column="type"></index>
    	<element column="answer" type="string"></element>
    </list>
     
  </class>  

 </hibernate-mapping>

3)在全局配置文件中增加

 	<!-- List of XML mapping files -->
   		<mapping resource="list/Question.hbm.xml"/>

4)测试

package list;

import java.util.ArrayList;

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

public class Test {
	
	public static void main(String[] args) {
		
		Configuration cfg = new Configuration();
		cfg.configure("hibernate.cfg.xml");
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
		session.beginTransaction();
		
		ArrayList<String> list1 = new ArrayList<String>();
		list1.add("answer1");
		list1.add("answer2");
		
		Question question1  = new Question();
		question1.setQname("question1");
		question1.setAnswers(list1);
		
		session.save(question1);
		
		session.getTransaction().commit();
		session.close();
		
		
		//factory.close();
		
		
	}

}

技术分享

技术分享

二 List一对多映射

一个问题有多个答案,每个答案有自己的信息,需要使用一对多关联来映射。

1)创建持久化类

package list;

import java.util.List;

public class Question {
	
	private int id;
	
	private String qname;
	
	private List<Answer> answers;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getQname() {
		return qname;
	}

	public void setQname(String qname) {
		this.qname = qname;
	}

	public List<Answer> getAnswers() {
		return answers;
	}

	public void setAnswers(List<Answer> answers) {
		this.answers = answers;
	}


	
	

}
package list;

public class Answer {
	
	private int id;
	
	private String answername;
	
	private String postedBy;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getAnswername() {
		return answername;
	}

	public void setAnswername(String answername) {
		this.answername = answername;
	}

	public String getPostedBy() {
		return postedBy;
	}

	public void setPostedBy(String postedBy) {
		this.postedBy = postedBy;
	}
	
	

}

2)配置文件

<?xml version=‘1.0‘ encoding=‘UTF-8‘?>  
<!DOCTYPE hibernate-mapping PUBLIC  
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

 <hibernate-mapping>  
  <class name="list.Question" table="quesion">  
  	 <cache usage="read-write"/>
    <id name="id">  
     <generator class="increment"></generator>  
    </id>  
    <property name="qname"></property> 
    <list name="answers" cascade="all">
    	<key column="qid"></key>
    	<index column="type"></index>
    	<one-to-many class="list.Answer"/>
    </list>
   </class>
   
    <class name="list.Answer" table="answers">  
	  	 <cache usage="read-write"/>
	    <id name="id">  
	     <generator class="increment"></generator>  
	    </id>  
	    <property name="answername"></property> 
	    <property name="postedBy"></property>
    </class>  

 </hibernate-mapping>

3)在hibernate.cfg.xml中添加配置

	 	<!-- List of XML mapping files -->
   		<mapping resource="list/Question.hbm.xml"/>

4)测试

package list;

import java.util.ArrayList;

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

public class Test {
	
	public static void main(String[] args) {
		
		Configuration cfg = new Configuration();
		cfg.configure("hibernate.cfg.xml");
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
		session.beginTransaction();
		
		Answer ans1 = new Answer();
		ans1.setAnswername("ans1");
		ans1.setPostedBy("post1");
		
		Answer ans2 = new Answer();
		ans2.setAnswername("ans2");
		ans2.setPostedBy("post2");
		
		Answer ans3 = new Answer();
		ans3.setAnswername("ans3");
		ans3.setPostedBy("post3");
		
		ArrayList<Answer> list1 = new ArrayList<Answer>();
		list1.add(ans1);
		list1.add(ans2);
		list1.add(ans3);
		
		
		Question question1  = new Question();
		question1.setQname("question1");
		question1.setAnswers(list1);
		
		
		session.save(question1);
		
		session.getTransaction().commit();
		session.close();
		
		
		//factory.close();
		
		
	}

}

  

 

以上是关于Hibernate之集合映射的主要内容,如果未能解决你的问题,请参考以下文章

hibernate的映射之三(多对多单向关联)

hibernate之关联映射

hibernate之关联映射

hibernate 表关系映射详解之多对多

Hibernate初探之一对多映射 继续学习

Hibernate初探之单表映射——通过Hibernate API编写访问数据库的代码