Hibernate 1-N 双相关联
Hibernate 可以通过主控方的实体加载被控方的实体,也可以通过被控方加载主控方的实体
接下来的一个实例将讲解1-n与n-1之间的双向关联;
1 首先配置hibernate.cfg.xml 文件,该文件放在src目录下(我用得是Hibernate 4.2.21)
<?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.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/wang</property>
<property name="hibernate.connection.username">root</property>
<!--数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--是否打印数据库语句到控制台-->
<property name="show_sql">true</property>
<property name="hibernate.show_sql">true</property>
<!--映射文件路径-->
<mapping resource="com/bean2/Factory.hbm.xml" />
<mapping resource="com/bean2/Product.hbm.xml" />
</session-factory>
</hibernate-configuration>
接下来是实体bean类
分别是Product.java 和Factory.java
private int id;
private String name;
private double price;
private Factory factory;
//省略get和set方法以及构造方法
private Integer factoryId;
private String factoryName;
private Set<Product> products=new HashSet<Product>();
//省略get和set方法以及构造方法
其实这中双向关联最难得是如何配置xml
Factory.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-12-27 15:20:18 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.bean2.Factory" table="FACTORY">
<id name="factoryId" type="java.lang.Integer">
<column name="factoryid" />
<generator class="native" />
</id>
<property name="factoryName" type="java.lang.String" length="45">
<column name="factoryName" />
</property>
<!--lazy=true 延迟加载的策略 Inverser=true 指定由多的一方维持关系-->
<set name="products" table="PRODUCT" inverse="true" lazy="true">
<key>
<!--对应PRODUCT表中的factoryid-->
<column name="factoryid" />
</key>
<one-to-many class="com.bean2.Product" />
</set>
</class>
</hibernate-mapping>
Product.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-12-27 15:20:18 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.bean2.Product" table="t_product">
<id name="id" type="int">
<column name="id" />
<!--以Hibernate根据底层数据库自行判断采用identity、hilo、sequence
其中一种作为主键生成方式。-->
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="45" />
</property>
<property name="price" type="double">
<column name="price" />
</property>
<!--多对一,多个产品可以由一个工厂生产- name="factory" 需要与对应的bean类相同->
<many-to-one name="factory" class="com.bean2.Factory">
<!--数据库列表名字-->
<column name="factoryid" />
</many-to-one>
</class>
</hibernate-mapping>
加载HIbernateUtil类在此不再详写
现在开始手动创建表
public class Test{
public void create(){
Configuration configuration=new Configuration().configure();
SchemaExport schemaExport=new SchemaExport(configuration);
schemaExport.create(true, true);//创建表完成
}
public void add(){
//接下来就是给表格添加数据.
Session session=HibernateUtil.getSession()
Transaction transaction= session.beginTransaction();
Product product=new Product();
product.setName("苹果");
product.setPrice(12.5);
Factory factory=new Factory();
factory.setName("苹果加工厂");
product.setFactory(factory);
factory.getProducts().add(product);
session.save(factory);
session.save(product);
transaction.commit();
session.close();
}
public void list(){
//我们已经向表格添加完成数据了
//接下来则是展示如何查询
Session session=HibernateUtil.getSession();
Transaction transaction= session.beginTransaction();
//持久化id为1的对象
Factory factory=(Factory)session.get(Factory.class,new Integer(1));
Set<Product> products=factory.getProducts();
System.out.println(products);//先输出看看是什么
//使用Iterator来迭代set集合
Iterator<Product> it=products.iterator();
while(it.hasNext()){
//如此就通过Factory查询到所有拥有该工厂生产的产品,同理可以反过来查询。
Product product=it.next();
System.out.println(product);
}
}