[Hibernate] - many to many
Hibernate的多对多实现:
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>
- <!-- Database connection settings -->
- <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="connection.url">jdbc:mysql://127.0.0.1/testdb</property>
- <property name="connection.username">root</property>
- <property name="connection.password"></property>
- <!-- JDBC connection pool (use the built-in) -->
- <property name="connection.pool_size">1</property>
- <!-- SQL dialect -->
- <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
- <!-- Enable Hibernate's automatic session context management -->
- <property name="current_session_context_class">thread</property>
- <!-- Disable the second-level cache -->
- <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
- <!-- Echo all executed SQL to stdout -->
- <property name="show_sql">true</property>
- <!-- Drop and re-create the database schema on startup -->
- <property name="hbm2ddl.auto">update</property>
- <mapping resource="com/my/hbm/User.hbm.xml"/>
- <mapping resource="com/my/hbm/Bank.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
mapping配置:
Bank.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!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.my.bean.Bank" table="bank">
- <id name="bankID" column="bank_id" type="long">
- <generator class="native"></generator>
- </id>
- <set name="users" table="card">
- <key column="bank_id"></key>
- <many-to-many class="com.my.bean.User" column="user_id"></many-to-many>
- </set>
- <property name="bankName" column="bank_name" type="java.lang.String" length="100" not-null="true"></property>
- </class>
- </hibernate-mapping>
User.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!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.my.bean.User" table="user">
- <id name="userID" column="user_id" type="long">
- <generator class="native"></generator>
- </id>
- <set name="banks" table="card">
- <key column="user_id"></key>
- <many-to-many class="com.my.bean.Bank" column="bank_id"></many-to-many>
- </set>
- <property name="userName" column="user_name" type="java.lang.String" length="100" not-null="true"></property>
- </class>
- </hibernate-mapping>
POJO
- package com.my.bean;
- import java.util.Set;
- public class Bank {
- private long bankID;
- private String bankName;
- private Set<User> users;
- public long getBankID() {
- return bankID;
- }
- public void setBankID(long bankID) {
- this.bankID = bankID;
- }
- public String getBankName() {
- return bankName;
- }
- public void setBankName(String bankName) {
- this.bankName = bankName;
- }
- public Set<User> getUsers() {
- return users;
- }
- public void setUsers(Set<User> users) {
- this.users = users;
- }
- }
- package com.my.bean;
- import java.util.Set;
- public class User {
- private long userID;
- private String userName;
- private Set<Bank> banks;
- public long getUserID() {
- return userID;
- }
- public void setUserID(long userID) {
- this.userID = userID;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public Set<Bank> getBanks() {
- return banks;
- }
- public void setBanks(Set<Bank> banks) {
- this.banks = banks;
- }
- }
测试:
- package com.my.init;
- import java.util.HashSet;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import com.my.bean.Bank;
- import com.my.bean.User;
- import com.my.dao.util.HibernateUtil;
- public class Test {
- public static void main(String[] args) {
- Session session = HibernateUtil.getSessionFactory().openSession();
- Transaction tx = session.beginTransaction();
- try {
- // create user
- User userRobin = new User();
- userRobin.setUserName("Robin");
- userRobin.setBanks(new HashSet<Bank>());
- User userBen = new User();
- userBen.setUserName("Ben");
- userBen.setBanks(new HashSet<Bank>());
- // create bank
- Bank bankCBC = new Bank();
- bankCBC.setBankName("CBC");
- bankCBC.setUsers(new HashSet<User>());
- Bank bankBBC = new Bank();
- bankBBC.setBankName("BBC");
- bankBBC.setUsers(new HashSet<User>());
- // add relationship
- userRobin.getBanks().add(bankCBC);
- userRobin.getBanks().add(bankBBC);
- userBen.getBanks().add(bankCBC);
- userBen.getBanks().add(bankBBC);
- session.save(userRobin);
- session.save(userBen);
- session.save(bankCBC);
- session.save(bankBBC);
- tx.commit();
- } catch (Exception e) {
- tx.rollback();
- e.printStackTrace();
- }
- session.close();
- }
- }
上面测试例子会自动生成一张表:card,这张是bank和user表的映射表。里头是bank_id和user_id两个组合字段。
如果想在这张映射表中加入额外的字段,那么hibernate似乎无法做到。因为这需要把多对多写成两个一对多的关系。事实上这样加额外字段到映射表,好像也是违反了DBMS的设计原则。
[Hibernate] - many to many的更多相关文章
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用
问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
- Hibernate中事务声明
Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...
- spring applicationContext.xml和hibernate.cfg.xml设置
applicationContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- [原创]关于Hibernate中的级联操作以及懒加载
Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...
- hibernate的基本xml文件配置
需要导入基本的包hibernate下的bin下的required和同bin下optional里的c3p0包下的所有jar文件,当然要导入mysql的驱动包了.下面需要注意的是hibernate的版本就 ...
- Maven搭建SpringMVC+Hibernate项目详解 【转】
前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- 文件夹差异文件对比工具 meld
/***************************************************************************************** * 文件夹差异文件 ...
- 云数据库 Bmob
/**************************************************************************************** * 云数据库 Bmo ...
- python解析smart结构数据
python编程解析如下smart结构数据,得到一行smart信息 run: smartctl -a /dev/sda out: smartctl 6.3 2014-07-26 r3976 [x86_ ...
- Guava 的学习
https://zhuanlan.zhihu.com/p/20637960 java.util jooq guavanettyminajodadubbobatchlucenceactivitiquar ...
- 彻底弄懂css中单位px和em,rem的区别 转的自己看
国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的 ...
- ajax 轮循
使用 AJAX 进行异步加载轮询操作.简单代码如下: <script> // 执行ajax轮循操作 function polling(){ var xmlhttp; // 判断浏览器--创 ...
- 转载:LBP代码详细注释
%LBP returns the local binary pattern image or LBP histogram of an image.% J = LBP(I,R,N,MAPPING,MOD ...
- left join测试验证之一
$ sqlite3 a.dbSQLite version 3.8.1 2013-10-17 12:57:35Enter ".help" for instructionsEnter ...
- jq版本1.7以上on方法使用结构
<script> $(function(){ $(document).on(" ...
- html中不要忽略一些细节
1. img必备和可选的参数都有写了上了,但是必备参数里的一个值alt没写(其实一些大型的专业门户网站其实也是有存在一些小问题的,只要我们细心一 点就能发现).虽然这样alt不写,在页面中也不会有任何 ...