单向关联关系
单向1->1
和单向N->1配置唯一不一样的地方是在many-to-one的标签上加上unique=“true”,即可完成1->1的映射
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Person" table="person_inf">
<!-- 映射标识属性 -->
<id name="id" column="person_id">
<!-- 指定主键生成器策略 -->
<generator class="identity"/>
</id>
<property name="age" type="java.lang.Integer"/>
<property name="name" type="java.lang.String"/>
<many-to-one name="address" cascade="all" column="address_id" class="Address" unique="true"/>
</class>
</hibernate-mapping>
单向1->N
public class Person
{
private int id;
private String name;
private int age;
private Set<Address> addresss=new HashSet<Address>();
public Person(){}
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 Set<Address> getAddresss() {
return addresss;
}
public void setAddresss(Set<Address> addresss) {
this.addresss = addresss;
}
}
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
<class name="Person" table="person_inf">
<!-- 映射标识属性 -->
<id name="id" column="person_id">
<!-- 指定主键生成器策略 -->
<generator class="identity"/>
</id>
<property name="age" type="java.lang.Integer"/>
<property name="name" type="java.lang.String"/>
<set name="addresss">
<key column="person_id"/>
<one-to-many class="Address"/>
</set>
</class>
</hibernate-mapping>
Address类和之前的一样,要注意的是一对多关系,会先对主表进行操作在对从表进行操作,比如插入一条sql,会先对主表插入数据,这时候主表的id还为确定,会在之后根据从表信息更新主表,所以不效率建议使用双向一对多关系。
public void singleOneToMany(){
Session session=HibernateUtil.currentSession();
tx=session.beginTransaction();
Person p=new Person();
Address a=new Address();
a.setAddressDetail("上海");
Address b=new Address();
b.setAddressDetail("北京");
session.persist(a);
session.persist(b);
p.setName("czk");
p.setAge(23);
p.getAddresss().add(a);
p.getAddresss().add(b);
session.save(p);
tx.commit();
HibernateUtil.closeSession();
}
单向N->1
public class Person
{
private int id;
private String name;
private int age;
private Address address;
public Person(){}
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;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", address=" + address.getAddressDetail() + "]";
}
}
<hibernate-mapping package="entity">
<class name="Person" table="person_inf">
<!-- 映射标识属性 -->
<id name="id" column="person_id">
<!-- 指定主键生成器策略 -->
<generator class="identity"/>
</id>
<property name="age" type="java.lang.Integer"/>
<property name="name" type="java.lang.String"/>
<many-to-one name="address" cascade="all" column="address_id" class="Address"/>
</class>
</hibernate-mapping>
many-to-one的cascade属性设置为all 是为了设置增删查改的级联关系,每次操作从表都先对主表做操作
public class Address {
private int adressId;
private String addressDetail;
public Address(){}
public int getAdressId() {
return adressId;
}
public void setAdressId(int adressId) {
this.adressId = adressId;
}
public String getAddressDetail() {
return addressDetail;
}
public void setAddressDetail(String addressDetail) {
this.addressDetail = addressDetail;
}
}
<hibernate-mapping package="entity">
<class name="Address" table="address_inf">
<id name="adressId" column="address_id">
<generator class="identity"/>
</id>
<property name="addressDetail" type="java.lang.String">
<column name="addressDetail"/>
</property>
</class>
</hibernate-mapping>
person_inf表
address_inf表
单向N->N