文章目录
两个实体之间是 整体 与部分的关系
地址细分,是整体的一部分。
联系方式是整体,地址是部分。
当整体结束的时候,部分也结束了(无意义了)
homeaddress与WorkAddress分别对应下面的四个属性
粗粒度的数据库模型
细粒度就是类的内聚性高,功能单一,增强类的可重用性。
扫描二维码关注公众号,回复:
13070220 查看本文章
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&characterEncoding=UTF-8</property>
<!-- & 是转义字符,此处是转义分号所用-->
<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&characterEncoding=UTF-8</property>
<!-- & 是转义字符,此处是转义分号所用-->
<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>