文章标题 Hibernate 1-N 双相关联

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);

   }

}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值