- 浏览: 456863 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
wjs876046992:
后来我下载了Eclipse Indigo版本,同样操作却成功了 ...
myeclipse2014中安装spket-1.6.23 -
wjs876046992:
我的是myEclipse2014,将那两个文件夹拷贝到drop ...
myeclipse2014中安装spket-1.6.23 -
lucky8060:
应该不是每次请求都产生一个action吧?应该是每个sessi ...
Struts2 action的单例与多例
注:(1)在项目开发中,经常遇到无法映射class的情况,所以最好在映射文件中将name和class的路径写完全。
(2)在1的数据表中不会出现set中的column,只会在n的一端的表中出现这个column字段。
一、双向1-N关联
使用无连接表的1-N关联
1.Person.java
person是1,address是n。一个人对应多个地址,所以在person类中有一个address的set集合。
package com.ru.domain; import java.util.HashSet; import java.util.Set; public class Person { private Integer p_id; private String name; private Set<Address> address=new HashSet<Address>(); public Integer getP_id() { return p_id; } public void setP_id(Integer p_id) { this.p_id = p_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Address> getAddress() { return address; } public void setAddress(Set<Address> address) { this.address = address; } }
2.Address.java
一个地址只对应一个人,所以用了一个person对象。
package com.ru.domain; public class Address { private Integer aid; private String addressname; private Person person; public Integer getAid() { return aid; } public void setAid(Integer aid) { this.aid = aid; } public String getAddressname() { return addressname; } public void setAddressname(String addressname) { this.addressname = addressname; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
注:在持久化类的映射文件中,1的一方不会在数据表中显示集合,通常只需要在n的一端数据表里增加一个外键。
3.Person.hbm.xml
注意:set集合里面的column并不会在数据表中出现,而是在n的一方address的数据表中出现,并且这个值和many-to-one里面的column属性值必须相同。
key里的column指向address表中的外键
<?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> <class name="com.ru.domain.Person" table="person"> <id name="p_id" column="person_id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="name" column="name" type="java.lang.String"></property> <!-- inverse=“true”是不控制关联关系 --> <set name="address" inverse="true"> <key column="person_id"></key> <one-to-many class="com.ru.domain.Address"/> </set> </class> </hibernate-mapping>
4.Address.hbm.xml
<?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> <class name="com.ru.domain.Address" table="address"> <id name="aid" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="addressname" column="addressname" type="java.lang.String"></property> <!-- 多对一个关联关系 --> <many-to-one name="person" column="person_id" class="com.ru.domain.Person"></many-to-one> </class> </hibernate-mapping>
5.testPerson.java
这个是service测试文件
package com.ru.service; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.ru.domain.Address; import com.ru.domain.Person; public class testPerson { public static void main(String[] args){ Configuration cf=new Configuration().configure("hibernate.cfg.xml"); SessionFactory sf=cf.buildSessionFactory(); Session s=sf.openSession(); Transaction ts=s.beginTransaction(); try { //人 Person p=new Person(); p.setName("如"); s.save(p); //p.setAddress(address); //第一个地址 Address a1=new Address(); a1.setAddressname("北京"); a1.setPerson(p); s.save(a1); //第二个地址 Address a2=new Address(); a2.setAddressname("天津"); a2.setPerson(p); s.save(a2); ts.commit(); s.close(); sf.close(); } catch (HibernateException e) { e.printStackTrace(); } } }
6.hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置mysql数据库 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/ru</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 自动创建表 --> <property name="hbm2ddl.auto">create</property> <!-- 显示sql语句 --> <property name="show_sql">true</property> <!-- 如果使用getCurrentSession,必须配置下面的属性 --> <!-- <property name="hibernate.current_session_context_class">thread</property> --> <mapping resource="com/ru/domain/Person.hbm.xml"/> <mapping resource="com/ru/domain/Address.hbm.xml"/> </session-factory> </hibernate-configuration>
二、双向N-N映射
只能采用连接表来建立两个实体间的N-N关联关系。
1、Person.java
package com.ru.domain; import java.util.HashSet; import java.util.Set; public class Person { private Integer pid; private String name; //1-n关联关系,使用set保存关连实体 private Set<Address> address=new HashSet();
2.Address.java
package com.ru.domain; import java.util.Set; public class Address { private Integer aid; private String addressdetail; //同样1-n,记录person实体的属性 private Set<Person> person;
3.Person.hbm.xml
<?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> <class name="com.ru.domain.Person" table="person"> <id name="pid" column="pid" type="java.lang.Integer"> <generator class="identity"></generator> </id> <property name="name" column="name" type="java.lang.String"></property> <!--映射n-n关联实体,两边的table属性必须有且必须相同 --> <set name="address" table="p_a"> <!-- 这个key中的column对应的是address表中的外键字段--> <key column="p_id"></key> <!--映射到的关联类属性,这里的a_id会在person表的字段中--> <many-to-many class="com.ru.domain.Address" column="a_id"></many-to-many> </set> </class> </hibernate-mapping>
4,Address.hbm.xml
<?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> <class name="com.ru.domain.Address" > <id name="aid" column="aid" type="java.lang.Integer"> <generator class="identity"></generator> </id> <property name="addressdetail" column="addressdetail" type="java.lang.String"></property> <set name="person" table="p_a"> <key column="a_id"></key> <!--这里的p_id是address表中字段--> <many-to-many class="com.ru.domain.Person" column="p_id"></many-to-many> </set> </class> </hibernate-mapping>
5.test.java
package com.ru.service; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.ru.domain.Address; import com.ru.domain.Person; public class test1 { public static void main(String[] args) { Configuration cf=new Configuration().configure(); SessionFactory sf=cf.buildSessionFactory(); Session session=sf.getCurrentSession(); Transaction ts=session.beginTransaction(); try { //向person中添加一条记录 Person p1=new Person(); p1.setName("如"); session.save(p1); //向address中添加一条记录 Address a1=new Address(); a1.setAddressdetail("北京"); session.save(a1); //主外键关系 p1.getAddress().add(a1); //a1.getPerson().add(p1); ts.commit(); } catch (Exception e) { e.printStackTrace(); } } }
注:会产生三个表
三、双向1-1关联
第一种关联策略:主键关联
1.Person.java
package com.ru.domain; public class Person { private Integer id; private String name; //1-1关系 private IdCard idcard;
2.IdCard.java
package com.ru.domain; public class Person { private Integer id; private String name; //1-1关系 private IdCard idcard;
3.Person.hbm.xml
<?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> <class name="com.ru.domain.Person" table="person"> <id name="id" column="id"> <!--定义主键生成策略--> <generator class="identity"/> </id> <property name="name" column="name" type="java.lang.String"/> <!--映射关联实体--> <one-to-one name="idcard"></one-to-one> </class> </hibernate-mapping>
4.IdCard.hbm.xml
<?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> <class name="com.ru.domain.IdCard" table="IdCard"> <id name="id" column="id" type="java.lang.Integer"> <generator class="foreign"> <!-- 该实体的主键根据person属性引用的实体的主键生成 --> <param name="property">person</param> </generator> </id> <property name="CardNo" column="cardno" type="java.lang.String"></property> <one-to-one name="person"></one-to-one> </class> </hibernate-mapping>
5.test.java
package com.ru.service; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.ru.domain.IdCard; import com.ru.domain.Person; public class test1 { public static void main(String[] args) { Configuration cf=new Configuration().configure(); SessionFactory sf=cf.buildSessionFactory(); Session session=sf.getCurrentSession(); Transaction ts=session.beginTransaction(); try { //向person中添加一条记录 Person p1=new Person(); p1.setName("如"); session.save(p1); //idcard IdCard ic=new IdCard(); ic.setCardNo("1111"); //这个必须有不然idcard不能声称主键 ic.setPerson(p1); session.save(ic); //主外键关系 ts.commit(); } catch (Exception e) { e.printStackTrace(); } } }
发表评论
-
java实现页面字符串换行空格方法(如果原始字符串存在换行和空格)
2014-09-28 14:23 2158适用于xml、json以及分条字符串 /** ... -
web里的路径获取方法总结
2014-09-25 17:27 6191、获取web系统根目录 String dirPath ... -
servlet或springmvc中得到web项目根路径
2014-07-07 14:53 20321、 request.getServletContext( ... -
springmvc controller和servlet中文乱码问题
2014-05-26 23:00 3679一、第一种方法通过tomcat配置和spring编码过滤器 ... -
flex拓扑图
2014-04-04 13:29 40123 -
使input type=“file”的浏览按钮透明隐藏的方法
2013-09-17 10:51 27637jsp代码: <input type="f ... -
hibernate3.6二级缓存
2013-06-14 09:31 1130使用spring的情况下: 注:首先确定hibernat ... -
一个过滤器实例
2013-06-04 17:33 1016public class AuthFilter imple ... -
Struts标签使用java帮助类方法
2013-06-04 14:53 497<s:property value="@co ... -
分页操作
2013-05-29 09:58 8721.使用hibernate (1)定义变量-页面传递当前 ... -
使用hibernate查询部分字段的方法
2013-04-08 10:35 924数据库操作: List<UserAudit> ... -
log4j使用笔记
2013-04-03 15:10 7991.导入log4j的jar包--log4j-1.2.13. ... -
Struts2 action的单例与多例
2013-03-05 18:03 14962struts 2的Action是多实例 ... -
得到本地和远程IP
2013-03-03 18:16 2145package com.ru.util; impor ... -
在类中获取得到路径,request,response,session
2013-03-02 19:01 5576package com.ru.action; imp ... -
hibernate的hql帮助类
2012-12-18 11:15 1357import java.io.Serializable; ... -
struts2的request,session,application
2012-12-04 16:30 10291.第一种方法(实现RequestAware,Sessi ... -
struts2实现文件上传
2012-10-07 16:06 9471.upload.jsp <%@ page ... -
struts2实现文件过滤
2012-10-07 17:09 1024一、手动实现文件过滤 1.uploadAction.java ... -
struts2实现文件下载
2012-10-07 19:02 1011注:struts2提供的下载功能,在action中只需要提 ...
相关推荐
**标题:“Hibernate关系映射”** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者将数据库操作转化为面向对象的方式,极大地简化了数据持久化的复杂性。"多对一"关系映射是Hibernate...
综上所述,这个压缩包提供了关于Hibernate关系映射的全面教程,包括多对多、一对一和一对多的关系配置,以及如何在Spring+Hibernate+Struts环境中应用这些关系。对于想要深入理解Hibernate并提升开发效率的Java...
Hibernate对象关系映射一对多 很基础等文档
hibernate关系映射,1V1,1vN,nVn,单相双相
hibernate关系映射系列1,单向1对1映射,意向Nto1 程序说明:生成mysql数据库,建立DB Browser连接后,用户可在程序中自动生成mysql表,非常简单,适合初学者了解hibernate映射机制,有问题可联系flyallen5@hotmail.com
Hibernate是一款强大的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库,而无需直接编写SQL语句。关系映射XML生成工具,如"Middlegen-Hibernate-r5",则是为了简化这一过程而设计的。这些工具能够自动...
**二、Hibernate关系映射的类型** 1. **一对一(OneToOne)**: 表示一个实体对应另一个实体的唯一实例。这可以通过在两个类中都定义`@OneToOne`注解来实现,并通过`mappedBy`属性指定被引用的一方。 2. **一对多...
Hibernate_关联关系映射配置详解,希望能帮助广大java爱好者
Hibernate4中映射关系图解。
<hibernate-mapping> <class name="com.bjsxt.hibernate.User" table="t_user"> <!-- --> </hibernate-mapping> <hibernate-mapping> <class name="com.bjsxt.hibernate.Group" ...
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的关联关系,...
现在我也正在学hibernate,于是我认为这东西对你也有用吧