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
相关文章推荐
- 库
- node.js 版本升级
- Log4j 配置 的webAppRootKey参数问题
- 智慧社区解决方案供应商-产品效果
- JNI开发中native层与Java层的交互
- Hbase客户端API基础小结笔记(未完)
- 我国发展人工智能三年行动实施方案的理论基础
- MFC笔记-SDI窗口-类之间的调用总结
- 嘿
- 处理textarea的空格和换行
- linux 安装apache 错误:configure: error: /bin/sh build/config.sub failed解决办法
- 半路出家的仓库管理员如何成为一个好的前端工程师(二)
- 开篇
- 通过jQuery Ajax使用FormData对象上传文件
- 对于java反射的理解
- 2015 Multi-University Training Contest 1 题集(长期更新)A B E
- nod-1629-B君的圆锥
- 1017. A除以B (20)
- maven仓库有jar包,还是找不到类
- Node.js 的优势和劣势都有哪些