Hibernate 多对一连接表单向关联
一、模型介绍?多个人(Person)对应一个地址(Address)。?二、实体(省略getter、setter方法)?public class Personn1tab {??? private int personid;??? private String name;??? private int age;??? private Addressn1tab addressn1tab;?public class Addressn1tab {??? private int addressid;??? private String addressdetail;?三、表模型?mysql> desc address_n1tab;+---------------+--------------+------+-----+---------+----------------+| Field???????? | Type???????? | Null | Key | Default | Extra????????? |+---------------+--------------+------+-----+---------+----------------+| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment || addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |+---------------+--------------+------+-----+---------+----------------+?mysql> desc join_n1tab;+------------+---------+------+-----+---------+-------+| Field????? | Type??? | Null | Key | Default | Extra |+------------+---------+------+-----+---------+-------+| personid?? | int(11) | NO?? | PRI |???????? |?????? || addressn1tab | int(11) | YES? | MUL | NULL??? |?????? |+------------+---------+------+-----+---------+-------+?mysql> desc person_n1tab;+----------+--------------+------+-----+---------+----------------+| Field??? | Type???????? | Null | Key | Default | Extra????????? |+----------+--------------+------+-----+---------+----------------+| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment || name???? | varchar(255) | YES? |???? | NULL??? |??????????????? || age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |+----------+--------------+------+-----+---------+----------------+?四、生成的SQL脚本?CREATE TABLE `address_n1tab` (? `addressid` int(11) NOT NULL auto_increment,? `addressdetail` varchar(255) default NULL,? PRIMARY KEY? (`addressid`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;?CREATE TABLE `join_n1tab` (? `personid` int(11) NOT NULL,? `address11fk` int(11) default NULL,? PRIMARY KEY? (`personid`),? KEY `FKAC780AAADAE3A82C` (`personid`),? KEY `FKAC780AAAC6242A64` (`address11fk`),? CONSTRAINT `FKAC780AAAC6242A64` FOREIGN KEY (`address11fk`) REFERENCES `address_n1tab` (`addressid`),? CONSTRAINT `FKAC780AAADAE3A82C` FOREIGN KEY (`personid`) REFERENCES `person_n1tab` (`personid`)) ENGINE=InnoDB DEFAULT CHARSET=gbk;?CREATE TABLE `person_n1tab` (? `personid` int(11) NOT NULL auto_increment,? `name` varchar(255) default NULL,? `age` int(11) default NULL,? PRIMARY KEY? (`personid`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk;??五、映射方法?<hibernate-mapping>??? <class name="com.lavasoft.dx._n_1_tab.Personn1tab" table="PERSON_n1tab">??????? <id name="personid">??????????? <generator style="padding-bottom: 0cm; padding-left: 5.4pt; width: 728pt; padding-right: 5.4pt; height: 14.25pt; padding-top: 0cm;">??????? </id>??????? <property name="name"/>??????? <property name="age"/>??????? <!--使用join元素显式确定链接表--> ??????? <join table="join_n1tab">??????????? <!--映射关联所用的外键--> ??????????? <key column="personid"/>??????????? <many-to-one name="addressn1tab"/>??????? </join>??? </class></hibernate-mapping>?<hibernate-mapping>??? <class name="com.lavasoft.dx._n_1_tab.Addressn1tab" table="ADDRESS_n1tab">??????? <id name="addressid">??????????? <generator style="padding-bottom: 0cm; padding-left: 5.4pt; width: 728pt; padding-right: 5.4pt; height: 14.25pt; padding-top: 0cm;">??????? </id>??????? <property name="addressdetail"/>??? </class></hibernate-mapping>??六、测试方法?public class Test_n1tab {??? public static void main(String[] args){??????? Personn1tab p1=new Personn1tab();??????? Personn1tab p2=new Personn1tab();???????? p1.setAge(21);??????? p1.setName("p1");???????? p2.setAge(23);??????? p2.setName("p2");???????? Addressn1tab add=new Addressn1tab();??????? add.setAddressdetail("郑州市经三路"); ???????? p1.setAddressn1tab(add);??????? p2.setAddressn1tab(add);???????? Session session=HibernateUtil.getCurrentSession();??????? Transaction tx=session.beginTransaction();??????? session.save(add);??????? session.save(p1);??????? session.save(p2);??????? tx.commit();??????? HibernateUtil.closeSession();??? }}?七、测试结果?1) :正常保存. 推荐这么干! ???????? session.save(p1);??????? session.save(p2);?Hibernate: insert into ADDRESS_n1tab (addressdetail) values (?)Hibernate: insert into PERSON_n1tab (name, age) values (?Hibernate: insert into join_n1tab (address11fk, personid) values (?Hibernate: insert into PERSON_n1tab (name, age) values (?Hibernate: insert into join_n1tab (address11fk, personid) values (??2) :正常保存. ??????? session.save(p1);??????? session.save(p2);??????? session.save(add);??Hibernate: insert into PERSON_n1tab (name, age) values (??Hibernate: insert into join_n1tab (address11fk, personid) values (??Hibernate: insert into PERSON_n1tab (name, age) values (??Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)