读书人

Hibernate 3多对多单向连接表联系关系

发布时间: 2012-11-21 08:23:25 作者: rapoo

Hibernate 3多对多单向连接表关联简单示例

多对多单向连接表关联:只要一个端有Set就可以了,在<set>的属性中指明POJO中的Set集合,对应的链接表名,子元素<key>声明本端对应的连接表中的主键,<many-to-many>声明对应的连接表中的另一端的主键及其对应的POJO类。

示例:
一个Person可以有多个Address,一个Address也可以有多个Person

POJO如下:
public class Addressnn implements java.io.Serializable{
??? private int addressid;
??? private String addressdetail;

??? public Addressnn(){

??? }
??? public Addressnn(String addressdetail){
??????? this.addressdetail=addressdetail;
??? }

??? public void setAddressid(int addressid){
??????? this.addressid=addressid;
??? }
??? public int getAddressid(){
??????? return this.addressid;
??? }

??? public void setAddressdetail(String addressdetail){
??????? this.addressdetail=addressdetail;
??? }
??? public String getAddressdetail(){
??????? return this.addressdetail;
??? }
}

?

public class Personnn implements java.io.Serializable{
??? private int personid;
??? private String name;
??? private int age;
??? private java.util.Set addresses=new java.util.HashSet();

??? public void setPersonid(int personid){
??????? this.personid=personid;
??? }
??? public int getPersonid(){
??????? return this.personid;
??? }
??? public void setName(String name){
??????? this.name = name;
??? }
??? public String getName(){
??????? return this.name;
??? }
??? public void setAge(int age){
??????? this.age=age;
??? }
??? public int getAge(){
??????? return this.age;
??? }

??? public void setAddresses(java.util.Set addresses){
??????? this.addresses = addresses;
??? }
??? public void addAddress(Addressnn ad){
??????? this.getAddresses().add(ad);
??? }
??? public java.util.Set getAddresses(){
??????? return this.addresses;
??? }
}

hbm.xml如下:
<!--Personnn.hbm.xml-->
<hibernate-mapping>
??? <class name="com.Personnn" table="person_nn">
??????? <id column="personid" name="personid" type="int">
??????????? <generator column="name" type="string"/>
??????? <property name="age" column="age" type="int"/>
???????? <!--映射集合属性,join_nn是连接表表名-->
???????? <set name="addresses" table="join_nn">
???????????? <key column="personid"/>
???????????? <many-to-many column="addressid" table="address_nn">
??????? <id column="addressid" name="addressid" type="int">
??????????? <generator column="addressdetail" type="string"/>
??? </class>
</hibernate-mapping>

数据库表如下:
mysql> desc person_nn;
?
+----------+--------------+------+-----+---------+----------------+
?
| 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 join_nn;
?
+-----------+---------+------+-----+---------+-------+
?
| Field???? | Type??? | Null | Key | Default | Extra |
?
+-----------+---------+------+-----+---------+-------+
?
| personid? | int(11) | NO?? | PRI |???????? |?????? |
?
| addressid | int(11) | NO?? | PRI |???????? |?????? |
?
+-----------+---------+------+-----+---------+-------+
?
?
?
mysql> desc person_nn;
?
+----------+--------------+------+-----+---------+----------------+
?
| Field??? | Type???????? | Null | Key | Default | Extra????????? |
?
+----------+--------------+------+-----+---------+----------------+
?
| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |
?
| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |
?
| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |
?
+----------+--------------+------+-----+---------+----------------+
?

main测试:

public class Test_nn {
??? public static void main(String args[]){
??????? Addressnn add1=new Addressnn();
??????? Addressnn add2=new Addressnn();
??????? Addressnn add3=new Addressnn();
??????? Personnn p1=new Personnn();
??????? Personnn p2=new Personnn();

??????? add1.setAddressdetail("郑州市经三路");
??????? add2.setAddressdetail("合肥市宿州路");
??????? add3.setAddressdetail("北京市长安路");
??????? p1.setName("wang");
??????? p1.setAge(30);
??????? p2.setName("lee");
??????? p2.setAge(50);

??????? p1.getAddresses().add(add1);
??????? p1.getAddresses().add(add2);
??????? p2.getAddresses().add(add2);
??????? p2.getAddresses().add(add3);

??????? Session session=HibernateUtil.getSession();
??????? Transaction t=session.beginTransaction();
??????? session.save(add1);
??????? session.save(add2);
??????? session.save(add3);
??????? session.save(p2);
??????? session.save(p1);
??????? t.commit();

??????? HibernateUtil.closeSession();
??? }
}

?

读书人网 >软件架构设计

热点推荐