在关系中,或多或少的表之间有复杂的关联关系
这里测试 一对多 关联关系的配置
开发步骤就不多说了。直接看一个示例。
users 用户 和 shop商品订单表
分析:一个用户可以有多个商品订单,一个订单只属于一个用户。
这样就构成了一对多的关联关系。
这里用的是oracle 数据库
users 和 shop 数据库表
create table users( id number(7) primary key, name nvarchar2(20), pass nvarchar2(20), address nvarchar2(50) ) create table shop( id number(7) primary key, price number(7), sh_name nvarchar2(50), us_id references users(id) )
2.users 实体
package com.hib.entity; import java.util.HashSet; import java.util.Set; public class Users { private Integer id; private String name; private String pass; private String address; private Set<Shop> shop = new HashSet<Shop>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Set<Shop> getShop() { return shop; } public void setShop(Set<Shop> shop) { this.shop = shop; } public Users(Integer id, String name, String pass, String address) { super(); this.id = id; this.name = name; this.pass = pass; this.address = address; } public Users() { super(); } @Override public String toString() { return "Users [id=" + id + ", name=" + name + ", pass=" + pass + ", address=" + address + "]"; } }
shop 实体
package com.hib.entity; public class Shop { private Integer id; private Integer price; private String sh_name; private Users users; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getSh_name() { return sh_name; } public void setSh_name(String sh_name) { this.sh_name = sh_name; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public Users getUsers() { return users; } public void setUsers(Users users) { this.users = users; } public Shop(Integer id, String sh_name, Integer price) { super(); this.id = id; this.sh_name = sh_name; this.price = price; } public Shop() { super(); } @Override public String toString() { return "Shop [id=" + id + ", sh_name=" + sh_name + ", price=" + price + "]"; } }
3.shop.hbm.xml映射文件配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping> <class name="com.hib.entity.Users" table="users"> <id name="id"> <generator class="increment"> </generator> </id> <property name="name"/> <property name="pass"/> <property name="address"/> <!-- 1的一方配置 invese: true 不维护关系 --> <set name="shop" inverse="true" cascade="all"> <!-- sh_id 是下面多一方的外键表中字段 --> <key column="us_id"/> <one-to-many class="com.hib.entity.Shop"/> </set> </class> <class name="com.hib.entity.Shop" table="shop"> <id name="id"> <generator class="increment"></generator> </id> <property name="sh_name"/> <property name="price"/> <many-to-one name="users" class="com.hib.entity.Users" column="us_id" cascade="none"/> </class> </hibernate-mapping>
4. 不要忘记注册。
<!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> <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property> <property name="hibernate.connection.username">ssh</property> <property name="hibernate.connection.password">ssh</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:xe</property> <!-- 方言 --> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- 可视化sql --> <property name="hibernate.show_sql">true</property> <!-- 格式化sql,自动对可视化sql换行,对齐 --> <property name="hibernate.format_sql">true</property> <!-- 为getCurrentSession添加配置,保证事务中公用义个session --> <property name="current_session_context_class">thread</property> <!-- 注册 --> <mapping resource="shop.hbm.xml"/> </session-factory> </hibernate-configuration>
5.测试 级联插入测试
@Test public void insert(){ Session session = HibUtil.getSession(); Transaction tx = session.beginTransaction(); Users users = new Users(null, "苦力强", "kuliqiang", "zg"); Shop shop = new Shop(null, "橙子", 2800); users.getShop().add(shop); shop.setUsers(users); session.save(users); tx.commit(); }
记得要设置级联关系。
测试 查询
@Test public void query(){ Session session = HibUtil.getSession(); Transaction tx = session.beginTransaction(); Users users = (Users)session.get(Users.class, 1); for (Shop shop : users.getShop()) { System.out.println(shop); } System.out.println(users); tx.commit(); }
更新和删除就不测试了,更新先查询出来,再修改值,然后更新就可以了。
删除直接查询出来,删除就可以了。
如果是单向的1对多 上面的可以修改为
users 实体不改变
shop 中的 users去掉
配置文件中 去掉下面这段配置
<many-to-one name="users" class="com.hib.entity.Users" column="us_id" cascade="none"/>
4. 配置文件中 inverse="true" 去掉,告诉主表,来维护从表
<set name="shop" inverse="true" cascade="all">
其他的还是一样操作。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。