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.Session;
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