Hibernate关联映射

单向关联关系

单向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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值