Hibernate单边一对多关联
2015-09-20 14:52
232 查看
单边一对多指一方中有集合属性,包含有多个对方,另一方中没有一方的引用。
本例使用的是人与qq账号作为举例,一个人可以有多个qq账号。每个qq账号只对应一个人。这一类例子比较多,本文只是一个举例而已。
qq实体类的java文件如下,对应数据库的表为tb_qq_number:
在hibernate的配置文件hibernate.cfg.xml中加入两个实体类的配置信息。
如修改后卫:
(2)、点击OneToManyTest.java文件,右键选择如下内容:
本例使用的是人与qq账号作为举例,一个人可以有多个qq账号。每个qq账号只对应一个人。这一类例子比较多,本文只是一个举例而已。
1、新建java工程
2、添加hibernate特性相关的库和MySql相关的jar包
本文使用MyEclipse自动向工程添加hibernate相关的库,使用方法如下:3、添加实体类
Person实体类如下,在数据库中对应的表为tb_person。package com.arvinfei.hibernate.bean; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinColumns; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; @Entity @Table(name = "tb_person") public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String name; //使用OneToMany配置一对多关系,fetch配置加载方式为延迟加载,targetEntity配置集合属性中的类型,因为qqs的类型为List<QQNumber>,因此targetEntity也可以省略。 @OneToMany(fetch = FetchType.LAZY, targetEntity = QQNumber.class, cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE, CascadeType.REFRESH }) @JoinColumns(value = { @JoinColumn(name = "person_id", referencedColumnName = "id") }) @OrderBy(value="number desc") private List<QQNumber> qqs = new ArrayList<QQNumber>(); public List<QQNumber> getQQs() { return qqs; } public void setQQs(List<QQNumber> qqs) { this.qqs = qqs; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
qq实体类的java文件如下,对应数据库的表为tb_qq_number:
package com.arvinfei.hibernate.bean; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "tb_qq_number") public class QQNumber { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String number; public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }
在hibernate的配置文件hibernate.cfg.xml中加入两个实体类的配置信息。
<mapping class="com.arvinfei.hibernate.bean.Person" /> <mapping class="com.arvinfei.hibernate.bean.QQNumber" />
4、修改sessionFactory
因为本文中使用注解的方式配置实体类,而是用向导添加的sessionFactory使用的是xml的方式添加实体类,所以需要修改HibernateSessionFactory.java中的配置为注解方式。如修改后卫:
private static Configuration configuration = new AnnotationConfiguration();
5、新建测试类
新建一个测试类用于测试上述代码,本文在工程中新建com.arvinfei.hibernate.test包,并在其中新建OneToManyTest.java用于测试。代码如下:package com.arvinfei.hibernate.test; import java.util.List; import org.hibernate.Session; import com.arvinfei.hibernate.bean.Person; import com.arvinfei.hibernate.bean.QQNumber; import com.arvinfei.hibernate.util.HibernateSessionFactory; public class OneToManyTest { public static void main(String[] args) throws Exception { Person person = new Person(); person.setName("arvinfei"); QQNumber qq1 = new QQNumber(); qq1.setNumber("296431319"); person.getQQs().add(qq1); QQNumber qq2 = new QQNumber(); qq2.setNumber("296431318"); person.getQQs().add(qq2); Session session = HibernateSessionFactory.getSession(); session.beginTransaction(); // 保存 Person 对象,会自动级联保存 qq 对象 session.persist(person); List list = session.createQuery( " select p from Person p left join fetch p.qqs q " + " where q.number = '296431319' ").list(); // 输出用户及其所有的用户 for (Person p : (List<Person>) list) { System.out.println("Person: " + p.getName()); for (QQNumber q : p.getQQs()) { System.out.println("qq: " + q.getNumber()); } } // 删除 Person 对象,会自动级联删除属于它的 qq 数据库记录 session.delete(person); session.getTransaction().commit(); session.close(); } }
6、运行测试
(1)、在MySql中新建数据库onetomany.命令如下:create database onetomany character set 'utf8';
(2)、点击OneToManyTest.java文件,右键选择如下内容:
7、资源下载
http://download.csdn.net/detail/yxtouch/9121827相关文章推荐
- java-WEB中的监听器Lisener
- GUI - Web前端开发框架
- Extjs4.0 最新最全视频教程
- MyEclipse Web Project转Eclipse Dynamic Web Project
- axis备忘
- Erlang实现的一个Web服务器代码实例
- 防止网页脚本病毒执行的方法-from web
- 自学成才的秘密:115个 web Develop 资源
- 使用批处理修改web打印设置笔记 适用于IE
- Apache Web让JSP“动”起来
- web下载的ActiveX控件自动更新
- 推荐六款WEB上传组件性能测试与比较第1/10页
- 关于三种主流WEB架构的思考
- 使用 Iisext.vbs 列出 Web 服务扩展文件的方法
- 使用 Iisext.vbs 删除 Web 服务扩展文件的方法
- 使用 iisext.vbs 禁用 Web 服务扩展的方法
- 用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
- web标准知识——从p开始,循序渐进
- web标准知识――用途相似的标签
- Shell脚本实现的一个简易Web服务器例子分享