关联映射之①:单向N--->1关联

来源:互联网 发布:dg加密软件破解 编辑:程序博客网 时间:2024/06/05 20:11

单向N--->1关联,比如多个人对应同一个住址,只需从人实体端可以找到对应的地址实体,无须关心某个地址的全部住户。

为了让两个持久化类支持这种关联映射,程序应该在N的一端的持久化类中增加一个属性,该属性引用1的一端的关联实体。

① 无连接表的N--->1关联

hibernate.cfg.xml :

<?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"><!-- Generated by MyEclipse Hibernate Tools.                   --><hibernate-configuration>    <session-factory>        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        <property name="connection.url">jdbc:mysql://localhost:3306/temp</property>        <property name="connection.username">root</property>        <property name="connection.password">mysqladmin</property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="hbm2ddl.auto">update</property>        <property name="show_sql">true</property>        <property name="format_sql">true</property>        <mapping resource="db/mapping/Person.hbm.xml"/>        <mapping resource="db/mapping/Address.hbm.xml"/>    </session-factory></hibernate-configuration>
Person.java :
public class Person {private int id;private String name;private int age;private Address address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}}
Address.java :
public class Address {private Integer addressId;private String addressDetail;public Address() {}public Address(String addressDetail) {this.addressDetail = addressDetail;}public Integer getAddressId() {return addressId;}public void setAddressId(Integer addressId) {this.addressId = addressId;}public String getAddressDetail() {return addressDetail;}public void setAddressDetail(String addressDetail) {this.addressDetail = addressDetail;}}
Person.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">        <hibernate-mapping package="db.domain">   <class name="Person" table="persons">       <id name="id" column="person_id">        <generator class="identity"/>    </id>    <property name="name" type="string"/>    <property name="age" type="integer"/>        <many-to-one name="address" class="Address" cascade="all" column="address_id"/>       </class></hibernate-mapping>
Address.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">        <hibernate-mapping package="db.domain">   <class name="Address" table="address">       <id name="addressId" column="address_id">        <generator class="identity"/>    </id>        <property name="addressDetail" type="string"/>       </class></hibernate-mapping>
Test.java :
public class Test {public static void main(String[] args) {Session session=HibernateSessionFactory.getSession();Transaction txt=session.beginTransaction();Person p=new Person();p.setName("tom");p.setAge(25);Address a=new Address("广州天河");p.setAddress(a);session.persist(p);Address a2=new Address("上海虹口");p.setAddress(a2);txt.commit();HibernateSessionFactory.closeSession();}}

② 有连接表的N--->1关联
对于绝大部分单向N--->1关联,使用基于外键的关联映射已经足够了。但是由于底层数据库建模时也可以使用连接表来建立这种关联关系,因此Hibernate也为这种关联关系提供了支持。

Person.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">        <hibernate-mapping package="db.domain">   <class name="Person" table="persons">       <id name="id" column="person_id">        <generator class="identity"/>    </id>    <property name="name" type="string"/>    <property name="age" type="integer"/>        <join table="person_address">        <key column="person_id"/>        <many-to-one name="address" class="Address" column="address_id" cascade="all"/>    </join>           </class></hibernate-mapping>
其余代码不变。




原创粉丝点击