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