Hibernate 多对多双向关联

news/2024/7/4 0:46:48 标签: hibernate, insert, null, join, class, generator
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

  
  
一、模型介绍 
  
多个人(Person )对应多个地址(Address )。
一个人可对应多个地址,一个地址也可以对应多个人。 
  
二、实体(省略getter 、setter 方法)
 
  
public class Personnn_sx { 
    private int personid; 
    private String name; 
    private int age; 
    private Set addresses=new HashSet(); 
  
public class Addressnn_sx { 
    private int addressid; 
    private String addressdetail; 
    private Set persons = new HashSet(); 
  
三、表模型 
  
mysql> desc person_nn_sx; 
+----------+--------------+------+-----+---------+----------------+ 
| Field    | Type         | Null | Key | Default | Extra          | 
+----------+--------------+------+-----+---------+----------------+ 
| personid | int(11)      | NO   | PRI | NULL    | auto_increment | 
| name     | varchar(255) | YES  |     | NULL    |                | 
| age      | int(11)      | YES  |     | NULL    |                | 
+----------+--------------+------+-----+---------+----------------+ 
  
mysql> desc address_nn_sx; 
+---------------+--------------+------+-----+---------+----------------+ 
| Field         | Type         | Null | Key | Default | Extra          | 
+---------------+--------------+------+-----+---------+----------------+ 
| addressid     | int(11)      | NO   | PRI | NULL    | auto_increment | 
| addressdetail | varchar(255) | YES  |     | NULL    |                | 
+---------------+--------------+------+-----+---------+----------------+ 
  
mysql> desc class="tags" href="/tags/JOIN.html" title=join>join_nn_sx; 
+-----------+---------+------+-----+---------+-------+ 
| Field     | Type    | Null | Key | Default | Extra | 
+-----------+---------+------+-----+---------+-------+ 
| addressid | int(11) | NO   | PRI |         |       | 
| personid  | int(11) | NO   | PRI |         |       | 
+-----------+---------+------+-----+---------+-------+ 
  
四、生成的SQL 脚本
 
  
/* Formatted on 2007/08/22 17:59 (QP5 v5.50) */ 
CREATE TABLE `address_nn_sx` ( 
  `addressid` int(11) NOT NULL auto_increment, 
  `addressdetail` varchar(255) default NULL, 
  PRIMARY KEY  (`addressid`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; 
  
/* Formatted on 2007/08/22 17:59 (QP5 v5.50) */ 
CREATE TABLE `person_nn_sx` ( 
  `personid` int(11) NOT NULL auto_increment, 
  `name` varchar(255) default NULL, 
  `age` int(11) default NULL, 
  PRIMARY KEY  (`personid`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; 
  
/* Formatted on 2007/08/22 17:59 (QP5 v5.50) */ 
CREATE TABLE `class="tags" href="/tags/JOIN.html" title=join>join_nn_sx` ( 
  `addressid` int(11) NOT NULL, 
  `personid` int(11) NOT NULL, 
  PRIMARY KEY  (`personid`,`addressid`), 
  KEY `FK6EBBC5EF6C600921` (`personid`), 
  KEY `FK6EBBC5EF2A92FF3D` (`addressid`), 
  CONSTRAINT `FK6EBBC5EF2A92FF3D` FOREIGN KEY (`addressid`) REFERENCES `address_nn_sx` (`addressid`), 
  CONSTRAINT `FK6EBBC5EF6C600921` FOREIGN KEY (`personid`) REFERENCES `person_nn_sx` (`personid`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; 
  
五、映射方法
 
  
<class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping> 
    <class name="com.lavasoft.sx._n_n.Personnn_sx" table="PERSON_nn_sx"> 
        <id name="personid"> 
            <generator class="identity"/> 
        </id> 
        <property name="name"/> 
        <property name="age"/> 
        <!-- 映射集合属性,关联到持久化类--> 
         <!--table="class="tags" href="/tags/JOIN.html" title=join>join_1ntab_sx" 指定了连接表的名字--> 
        <set name="addresses" 
             table="class="tags" href="/tags/JOIN.html" title=join>join_nn_sx" 
             cascade="all"> 
            <!--column="personid" 指定连接表中关联当前实体类的列名--> 
            <key column="personid" not-class="tags" href="/tags/NULL.html" title=null>null="true"/> 
            <!--column="addressid" 是连接表中关联本实体的外键--> 
            <many-to-many column="addressid" 
                          class="com.lavasoft.sx._n_n.Addressnn_sx"/> 
        </set> 
    </class
</class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping> 
  
<class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping> 
    <class name="com.lavasoft.sx._n_n.Addressnn_sx" 
           table="ADDRESS_nn_sx"> 
        <id name="addressid"> 
            <generator class="identity"/> 
        </id> 
        <property name="addressdetail"/> 
         <!--table="class="tags" href="/tags/JOIN.html" title=join>join_nn_sx" 是双向多对多的连接表--> 
        <set name="persons" 
             inverse="true" 
             table="class="tags" href="/tags/JOIN.html" title=join>join_nn_sx"> 
            <!--column="addressid" 是连接表中关联本实体的外键--> 
            <key column="addressid"/> 
            <many-to-many column="personid" 
                          class="com.lavasoft.sx._n_n.Personnn_sx"/> 
        </set> 
    </class
</class="tags" href="/tags/HIBERNATE.html" title=hibernate>hibernate-mapping> 
  
六、测试方法 
  
public class Test_nn_sx { 
    public static void main(String[] args){ 
        Addressnn_sx add1=new Addressnn_sx(); 
        Addressnn_sx add2=new Addressnn_sx(); 
        Personnn_sx p1=new Personnn_sx(); 
        Personnn_sx p2=new Personnn_sx(); 
  
        add1.setAddressdetail(" 郑州市经三路"); 
        add2.setAddressdetail(" 合肥市宿州路"); 
        p1.setName("wang"); 
        p1.setAge(30); 
        p2.setName("zhang"); 
        p2.setAge(22); 
  
        p1.getAddresses().add(add1); 
        p1.getAddresses().add(add2); 
        p2.getAddresses().add(add2); 
        add1.getPersons().add(p1); 
        add2.getPersons().add(p1); 
        add2.getPersons().add(p2); 
  
  
        Session session= HibernateUtil.getCurrentSession(); 
        Transaction tx=session.beginTransaction(); 
        session.save(p1); 
        session.save(p2); 
//        session.saveOrUpdate(add1); 
//        session.saveOrUpdate(add2); 
        tx.commit(); 
        HibernateUtil.closeSession(); 
    } 

  
七、测试结果 
  
1) : 正常保存. 
        session.save(p1); 
        session.save(p2); 
//        session.saveOrUpdate(add1); 
//        session.saveOrUpdate(add2); 
  
  Hibernate: class="tags" href="/tags/INSERT.html" title=insert>insert into PERSON_nn_sx (name, age) values (?, ? ) 
  Hibernate: class="tags" href="/tags/INSERT.html" title=insert>insert into ADDRESS_nn_sx (addressdetail) values (?) 
  Hibernate: class="tags" href="/tags/INSERT.html" title=insert>insert into ADDRESS_nn_sx (addressdetail) values (?) 
  Hibernate: class="tags" href="/tags/INSERT.html" title=insert>insert into PERSON_nn_sx (name, age) values (?, ? ) 
  Hibernate: class="tags" href="/tags/INSERT.html" title=insert>insert into class="tags" href="/tags/JOIN.html" title=join>join_nn_sx (personid, addressid) values (?, ? ) 
  Hibernate: class="tags" href="/tags/INSERT.html" title=insert>insert into class="tags" href="/tags/JOIN.html" title=join>join_nn_sx (personid, addressid) values (?, ? ) 
  Hibernate: class="tags" href="/tags/INSERT.html" title=insert>insert into class="tags" href="/tags/JOIN.html" title=join>join_nn_sx (personid, addressid) values (?, ? ) 

 
本文出自 “熔 岩” 博客,转载请与作者联系!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/songmin3121/archive/2009/05/25/4214691.aspx


http://www.niftyadmin.cn/n/1425358.html

相关文章

Python使用RabbitMQ

1.消息队列介绍 MQ全称为Message Queue 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表&#xff0c;一端往消息队列中不断写入消息&#xff0c;而另一端则可以读取队列中的消息。这样发布者和使用者都不用知道对…

Hibernate 实体关联关系映射

http://blog.csdn.net/songmin3121/archive/2009/05/25/4214522.aspx Hibernate 实体关联关系映射花了三天的业余时间&#xff0c;终于写完了Hibernate关联关系映射的所有实例&#xff0c;感觉还应该总结一下。Hibernate映射关系错综复杂&#xff0c;在实际中真的都能用到吗&am…

Python赋值小知识补充

#单个变量赋值 x 1 #两个变量赋值 a,b 1,2 #即a 1 &#xff0c;b 2 ; 等同于 a,b [1,2]q,w [1,2,3] #此时会报ValueError:too many values to unpack&#xff1b; #可以用如下方法解决&#xff1a; q,*w [1,2,3] #即q 1 &#xff0c;w [1,2]以上表述的两个变量赋值…

python怎么实现直播_做直播能有多赚钱,Python告诉你

前面我们介绍了APP爬虫环境的搭建和mitmproxy工具的简单使用&#xff0c;这次我们要来一个简单的APP爬虫&#xff0c;尝试一下APP爬虫的简单实用&#xff0c;顺便让我们看看喜马拉雅上的主播到底有多赚钱。 APP爬虫一般分为两种方式&#xff0c;一种是直接分析破解应用的API&am…

matlab中如何调用gpu进行并行计算_GPU计算加速01 : AI时代人人都应该了解的GPU知识

我和滴滴云有一些合作&#xff0c;没有GPU的朋友可以前往滴滴云上购买GPU/vGPU/机器学习产品&#xff0c;记得输入AI大师码&#xff1a;1936&#xff0c;可享受9折优惠。GPU产品分时计费&#xff0c;比自己购买硬件更划算&#xff0c;请前往滴滴云官网http://www.didiyun.com购…

JSF常见错误

java.lang.IllegalStateException: No thread-bound request: use RequestContextFilter 是因为在Web.xml中配置没有增加Spring的相应Listener, 将下面代码贴如Web.xml中即可。 <listener> <listener-class> org.springframework.web.context.request.Req…

Python时间+日期模块_timedatetime模块

目录 一、时间time模块 1.三种时间的表达方式 2.三种时间表达方式的相互转换 3.时间的其他格式 二、日期datetime模块 1. datetime模块有一下几个类 2.datetime类 3.date和time类 4.datetime.timedelta类 一、时间time模块 1.三种时间的表达方式 时间的三种形式&…

python文件指针_python 文件指针及文件覆盖

1、文件纯净模式延伸 rt:可读、可写 wt:可写、可读 with open(b.txt,wt,encodingutf-8) as f: print(f.readable()) print(f.writable()) at:可追加写、可读 2、控制文件指针移动 方法&#xff1a;f.seek(offset,whence) offset代表文件指针的偏移量&#xff0c;单位是字节byte…