您的位置:首页 > 其它

hibernate的many-to-many的示例

2016-05-28 01:51 429 查看

hibernate的many-to-many的示例

————不管失败成功,我只想认真活一生!

为java工程师奋斗的我!

小弟刚刚结束三大框架里的struts2,马马虎虎吧,也不知道到底掌握的如何。那么就这么算过去了。前两天开始了第二个框架,hibernate!额,学了也快三天了吧,里面的门道也能稍微可以看出来了。所以呢,一个小小的示例还是要有的。呵呵。

这是一个hibernate的映射问题,1-N,N-1,1-1,N-N,这么几种吧。个人觉得前面几种应该不难,有难度的还是n-n,刚开始有点混,后来多想想还是蛮简单的。下面开始吧。

同样实例采用mvc的架构。首先贴出两个javabean。

package com.gang.entity;

import java.util.HashSet;
import java.util.Set;
//这是一个人类
public class Person {

private int pid;
private String name;
private String sex;
private Set<Address> addresses=new HashSet<Address>();
//省略各元素的setter,getter方法
...
//构造器
public Person(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
public Person(int pid, String name, String sex) {
super();
this.pid = pid;
this.name = name;
this.sex = sex;
}

}


//这是一个地址类
package com.gang.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Address implements Serializable{
private  int aid;
private  String aname;
private  String adesc;
private  Set<Person> persons=new HashSet<Person>();
//省略个元素的setter,getter方法
...
//构造器
public Address(int aid, String aname, String adesc) {
super();
this.aid = aid;
this.aname = aname;
this.adesc = adesc;
}
public Address(String aname, String adesc) {
super();
this.aname = aname;
this.adesc = adesc;
}

}


ok!两个javabean搞定,当然这是小儿科。hibernate在表映射方面即可以使用注释,也可以使用hbm.xml配置文件进行配置。我还是采用后者。

<!--这是地址的配置文件-->
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-5-28 0:17:19 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.gang.entity.Address" table="address">
<id name="aid" type="int">
<column name="aid" />
<generator class="increment" />
</id>
<property name="aname" type="java.lang.String">
<column name="aname" />
</property>
<property name="adesc" type="java.lang.String">
<column name="adesc" />
</property>
<!--这是地址类里的人类,他们是主外键关系,并将这两个类的id分别作为各自的外键,保存在p_a数据表里-->
<set name="persons" table="p_a" inverse="false" cascade="all">
<key>
<column name="aid" />
</key>
<many-to-many class="com.imooc.entity.Person" column="pid"/>
</set>
</class>
</hibernate-mapping>


<!--这是人类的配置文件-->
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-5-28 0:17:19 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.imooc.entity.Person" table="person">
<id name="pid" type="int">
<column name="pid" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="name" />
</property>
<property name="sex" type="java.lang.String">
<column name="sex" />
</property>
<!--这是人类里的地址类,他们是主外键关系,并将这两个类的id分别作为各自的外键,保存在p_a数据表里-->
<set name="addresses" table="p_a" cascade="save-update" inverse="true">
<key>
<column name="pid" />
</key>
<many-to-many class="com.imooc.entity.Address" column="aid"/>
</set>
</class>
</hibernate-mapping>


两个javabean,两个配置文件 很清晰。接下来是hibernate的配置文件。这文件学过hibernate就应该非常清了.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">chen*****</property>
<property name="hibernate.connection.url">
<![CDATA[
jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf8
]]>
</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>

<!-- 指定映射文件的路径 -->
<mapping resource="com/gang/entity/Address.hbm.xml"/>
<mapping resource="com/gang/entity/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>


最后呢 我们对他进行测试。

首先编写工具类,用于测试前获取必要的对象。

package com.gang.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
private static SessionFactory sessionFactory;
private static Session session;

static {
// 创建Configuration对象,读取hibernate.cfg.xml文件,完成初始化
Configuration config = new Configuration().configure();
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
.applySettings(config.getProperties());
StandardServiceRegistry ssr=ssrb.build();
sessionFactory=config.buildSessionFactory(ssr);
}

//获取SessionFactory
public static SessionFactory getSessionFactory(){
return sessionFactory;
}

//获取Session
public static Session getSession(){
session=sessionFactory.openSession();
return session;
}

//关闭Session
public static void closeSession(Session session){
if(session!=null){
session.close();
}
}
}


最后就是测试:

package com.gang.test;

import org.hibernate.Sessio
a635
n;
import org.hibernate.Transaction;

import com.imooc.entity.Address;
import com.imooc.entity.Person;
import com.imooc.util.HibernateUtil;

public class test {

private static Session session;
public static void save(){
Person p1=new Person("张三", "男");
Person p2=new Person("李四", "男");
Address a1=new Address("浙江", "德清");
Address a2=new Address("浙江", "yuyue");
p1.getAddresses().add(a1);
p1.getAddresses().add(a2);
p2.getAddresses().add(a1);
a2.getPersons().add(p1);
a1.getPersons().add(p2);
a1.getPersons().add(p1);
session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
session.save(p1);
session.save(p2);
tx.commit();
HibernateUtil.closeSession(session);

}

public static void main(String[] args) {
save();
}
}


。运行上述代码,我们发现数据库中多了三个表







不错,和源代码里的设置一致。(张三既在德清也在yuyue,而李四只在德清)。

三大框架说简单算简单,说难也有点难。呵呵! 加油吧。把他踩在脚底下。

2016/5/28 1:48am
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: