Hibernate框架-04-03-Hibernate-组合关系映射


在这里插入图片描述

两个实体之间是 整体 与部分的关系

在这里插入图片描述

地址细分,是整体的一部分。
联系方式是整体,地址是部分。
当整体结束的时候,部分也结束了(无意义了)

在这里插入图片描述

homeaddress与WorkAddress分别对应下面的四个属性

在这里插入图片描述

粗粒度的数据库模型

细粒度就是类的内聚性高,功能单一,增强类的可重用性。

在这里插入图片描述

在这里插入图片描述

XML格式配置

项目结构

在这里插入图片描述

Address.java

package com.hibernate.entity;

import javax.persistence.Embeddable;

public class Address {
    
    

	private String province;
	private String city;
	private String district;
	private String detail;
	
	
	public String getProvince() {
    
    
		return province;
	}
	public void setProvince(String province) {
    
    
		this.province = province;
	}
	public String getCity() {
    
    
		return city;
	}
	public void setCity(String city) {
    
    
		this.city = city;
	}
	public String getDistrict() {
    
    
		return district;
	}
	public void setDistrict(String district) {
    
    
		this.district = district;
	}
	public String getDetail() {
    
    
		return detail;
	}
	public void setDetail(String detail) {
    
    
		this.detail = detail;
	}
	@Override
	public String toString() {
    
    
		return "Address [province=" + province + ", city=" + city + ", district=" + district + ", detail=" + detail
				+ "]";
	}
	
	
}

Contact.java

package com.hibernate.entity;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;

//组合关系中的整体实体

public class Contact {
    
    

	private Integer id;
	private String phoneNum;
	private String email;
	
	private Address homeAddress;
	private Address workAddress;
	
	public Integer getId() {
    
    
		return id;
	}
	public void setId(Integer id) {
    
    
		this.id = id;
	}
	public String getPhoneNum() {
    
    
		return phoneNum;
	}
	public void setPhoneNum(String phoneNum) {
    
    
		this.phoneNum = phoneNum;
	}
	public String getEmail() {
    
    
		return email;
	}
	public void setEmail(String email) {
    
    
		this.email = email;
	}
	
	public Address getHomeAddress() {
    
    
		return homeAddress;
	}
	public void setHomeAddress(Address homeAddress) {
    
    
		this.homeAddress = homeAddress;
	}

	public Address getWorkAddress() {
    
    
		return workAddress;
	}
	public void setWorkAddress(Address workAddress) {
    
    
		this.workAddress = workAddress;
	}
	@Override
	public String toString() {
    
    
		return "Contact [id=" + id + ", phoneNum=" + phoneNum + ", email=" + email + ", homeAddress=" + homeAddress
				+ ", workAddress=" + workAddress + "]";
	}
	
	
}

Contact.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.entity">
    <class name="Contact" table="hibernate_04_03_contact">
    	<id name="id" type="int" column="id">
    	    <generator class="identity"/>
    	</id>
    	<property name="phoneNum" column="phone"/>
    	<property name="email"/>
    	
    	<!-- 映射组合关系 ,name=属性名字,class=类型-->
    	<component name="homeAddress" class="Address">
    		<!-- Address类中定义的属性同数据库表中字段的映射 -->
    		<property name="province" column="home_province"></property>
    		<property name="city" column="home_city"></property>
    		<property name="district" column="home_district"></property>
    		<property name="detail" column="home_detail"></property>
    	</component>
    	<component name="workAddress" class="Address">
    		<!-- Address类中定义的属性同数据库表中字段的映射 -->
    		<property name="province" column="work_province"></property>
    		<property name="city" column="work_city"></property>
    		<property name="district" column="work_district"></property>
    		<property name="detail" column="work_detail"></property>
    	</component>
    </class>
</hibernate-mapping>

Test.java

package com.hibernate.ui;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.proxy.HibernateProxyHelper;

import com.hibernate.entity.Address;
import com.hibernate.entity.Contact;
import com.hibernate.util.HibernateUtil;

public class Test {
    
    

	public static void main(String[] args) {
    
    
		
		saveContact();
		
		HibernateUtil.closeSessionFactory();
	}
	
	public static void saveContact() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		Contact c = new Contact();
		c.setPhoneNum("1502323232");
		c.setEmail("[email protected]");
		
		Address home = new Address();
		home.setProvince("河北省");
		home.setCity("石家庄市");
		home.setDistrict("裕华区");
		home.setDetail("南二环");
		
		Address work = new Address();
		work.setProvince("河北省");
		work.setCity("邢台市");
		work.setDistrict("某区");
		work.setDetail("南二环");
		
		c.setHomeAddress(home);
		c.setWorkAddress(work);
		
		session.save(c);
		tx.commit();
		session.close();
	}

}

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 版本号,编码方式 -->

<!DOCTYPE 
hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- 文档类型,指定了网址可以下载文档定义文件,以确定下面可以出现的标签与规则 -->

<hibernate-configuration><!-- 根元素,必须包含此元素 -->

	<session-factory>
	<!-- 每一个 property就是一个配置项 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- dialect是方言,表明用的是什么数据库方言  -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库驱动类,指定类名 -->
		<!-- 下面是链接数据库的信息,和JDBC类似 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate-database?useUicode=true&amp;characterEncoding=UTF-8</property>
		<!-- &amp  是转义字符,此处是转义分号所用-->
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password"></property>
		
		<!-- 上面5个配置项是必选的,下面两个是可选的,分别是打印sql语句与格式化sql语句,便于调试-->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		
		<!-- 设置映射文件,属性值是包名+文件名,注意格式变化,点变成了斜杠-->

		<mapping resource="com/hibernate/entity/Contact.hbm.xml"/>

	</session-factory>
	
</hibernate-configuration>




数据库表结构

在这里插入图片描述




这个标签是专门用来映射组合关系的

在这里插入图片描述

在这里插入图片描述

注解形式配置

项目结构

Address.java

package com.hibernate.entity;

import javax.persistence.Embeddable;

/**
 * 组合关系表示的是整体和部分的关系
 * 组合关系中的部分实体不需要定义OID属性(不单独对它做持久化操作)
 * @author onest
 *
 */
@Embeddable//(这个类不单独做映射,不需要单独进行持久化操作)
//在整体类做映射,不在部分类做映射
public class Address {
    
    

	private String province;
	private String city;
	private String district;
	private String detail;
	
	
	public String getProvince() {
    
    
		return province;
	}
	public void setProvince(String province) {
    
    
		this.province = province;
	}
	public String getCity() {
    
    
		return city;
	}
	public void setCity(String city) {
    
    
		this.city = city;
	}
	public String getDistrict() {
    
    
		return district;
	}
	public void setDistrict(String district) {
    
    
		this.district = district;
	}
	public String getDetail() {
    
    
		return detail;
	}
	public void setDetail(String detail) {
    
    
		this.detail = detail;
	}
	@Override
	public String toString() {
    
    
		return "Address [province=" + province + ", city=" + city + ", district=" + district + ", detail=" + detail
				+ "]";
	}
	
	
}

Contact.java

package com.hibernate.entity;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;

//组合关系中的整体实体
@Entity(name="hibernate_04_03_CONTACT ")
public class Contact {
    
    

	private Integer id;
	private String phone;
	private String email;
	
	private Address homeAddress;
	private Address workAddress;
	
	@Id
	@GeneratedValue(generator="my_gen")
	@GenericGenerator(name="my_gen",strategy="native")
	public Integer getId() {
    
    
		return id;
	}
	public void setId(Integer id) {
    
    
		this.id = id;
	}
	@Column(name="phone")
	public String getPhone() {
    
    
		return phone;
	}
	public void setPhone(String phoneNum) {
    
    
		this.phone = phoneNum;
	}
	public String getEmail() {
    
    
		return email;
	}
	public void setEmail(String email) {
    
    
		this.email = email;
	}
	
	@Embedded//表示属性是是嵌入的
	//开始映射嵌入的属性,多个数据需要大括号
	@AttributeOverrides(value= {
    
    
			@AttributeOverride(name="province",
					column=@Column(name="HOME_PROVINCE")),
			@AttributeOverride(name="city",
					column=@Column(name="HOME_CITY")),
			@AttributeOverride(name="district",
					column=@Column(name="HOME_DISTRICT")),
			@AttributeOverride(name="detail",
					column=@Column(name="HOME_DETAIL"))
			
	})	
	public Address getHomeAddress() {
    
    
		return homeAddress;
	}
	public void setHomeAddress(Address homeAddress) {
    
    
		this.homeAddress = homeAddress;
	}
	
	@Embedded//是嵌入的
	@AttributeOverrides(value= {
    
    
			@AttributeOverride(name="province",
					column=@Column(name="WORK_PROVINCE")),
			@AttributeOverride(name="city",
					column=@Column(name="WORK_CITY")),
			@AttributeOverride(name="district",
					column=@Column(name="WORK_DISTRICT")),
			@AttributeOverride(name="detail",
					column=@Column(name="WORK_DETAIL"))
			
	})
	public Address getWorkAddress() {
    
    
		return workAddress;
	}
	public void setWorkAddress(Address workAddress) {
    
    
		this.workAddress = workAddress;
	}
	@Override
	public String toString() {
    
    
		return "Contact [id=" + id + ", phone=" + phone + ", email=" + email + ", homeAddress=" + homeAddress
				+ ", workAddress=" + workAddress + "]";
	}
	
	
}

Test.java

package com.hibernate.ui;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.proxy.HibernateProxyHelper;

import com.hibernate.entity.Address;
import com.hibernate.entity.Contact;
import com.hibernate.util.HibernateUtil;

public class Test {
    
    

	public static void main(String[] args) {
    
    
		
		saveContact();
		
		HibernateUtil.closeSessionFactory();
	}
	
	public static void saveContact() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		Contact c = new Contact();
		c.setPhone("1502323232");
		c.setEmail("[email protected]");
		
		Address home = new Address();
		home.setProvince("河北省");
		home.setCity("石家庄市");
		home.setDistrict("裕华区");
		home.setDetail("南二环");
		
		Address work = new Address();
		work.setProvince("河北省");
		work.setCity("邢台市");
		work.setDistrict("某区");
		work.setDetail("南二环");
		
		c.setHomeAddress(home);
		c.setWorkAddress(work);
		
		session.save(c);
		tx.commit();
		session.close();
	}

}

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 版本号,编码方式 -->

<!DOCTYPE 
hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- 文档类型,指定了网址可以下载文档定义文件,以确定下面可以出现的标签与规则 -->

<hibernate-configuration><!-- 根元素,必须包含此元素 -->

	<session-factory>
	<!-- 每一个 property就是一个配置项 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- dialect是方言,表明用的是什么数据库方言  -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库驱动类,指定类名 -->
		<!-- 下面是链接数据库的信息,和JDBC类似 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate-database?useUicode=true&amp;characterEncoding=UTF-8</property>
		<!-- &amp  是转义字符,此处是转义分号所用-->
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password"></property>
		
		<!-- 上面5个配置项是必选的,下面两个是可选的,分别是打印sql语句与格式化sql语句,便于调试-->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		
		<!-- 设置映射文件,属性值是包名+文件名,注意格式变化,点变成了斜杠-->
  		<mapping class="com.hibernate.entity.Contact"/>
  		<mapping class="com.hibernate.entity.Address"/>

	</session-factory>
	
</hibernate-configuration>




数据库

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/115007930