组件(Component)是一个被包含的对象,在此例中Wife就是被包含的对象,被包含在Husband中。
方法一:使用Annotation实现
(1)建立Husband类和Wife类
package com.model;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Husband {
private int id;
private String name;
private Wife wife;
@Id
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;
}
@Embedded
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}package com.model;
public class Wife {
private String wifeName;
private String wifeAge;
public String getWifeName() {
return wifeName;
}
public void setWifeName(String wifeName) {
this.wifeName = wifeName;
}
public String getWifeAge() {
return wifeAge;
}
public void setWifeAge(String wifeAge) {
this.wifeAge = wifeAge;
}
}
(2)设置Hibernate配置文件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 name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 连接的数据库的url -->
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 连接的数据库的用户名-->
<property name="connection.username">root</property>
<!-- 连接的数据库的密码 -->
<property name="connection.password"></property>
<!-- 配置Hibernate数据库方言 -->
<property name="Dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 输出执行的SQL语句 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 启动时撤销并重新创建数据库的模式-->
<property name="hbm2ddl.auto">create</property>
<property name="current_session_context_class">thread</property>
<mapping class="com.model.Husband"/>
</session-factory>
</hibernate-configuration>
(3)建立测试类,此处使用Junit4进行测试,仅仅测试组件映射如何建表即可。
package com.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
public class ORMappingTest {
@Test
public void test() {
Configuration cfg = new Configuration();
cfg.configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sf = cfg.buildSessionFactory(sr);
Session s = sf.getCurrentSession();
Transaction tx = s.beginTransaction();
tx.commit();
sf.close();
}
}
(4)运行测试类,查看后台输出的建表SQL语句。
Hibernate:
create table Husband (
id integer not null,
name varchar(255),
wifeAge varchar(255),
wifeName varchar(255),
primary key (id)
)
------------------在实体中可以定义一个嵌入式组件(embedded component), 甚至覆盖该实体中原有的列映射. 组件类必须在类一级定义@Embeddable注解. 在特定的实体的关联属性上使用@Embedded注解可以覆盖该属性对应的嵌入式对象的列映射。
方法二:使用映射文件hbm.xml实现:
(1)建立Husband类和Wife类,在方法一的基础上去掉@注解即可。
(2)建立映射文件Husband.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.model">
<class name="Husband">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<component name="wife">
<property name="wifeName" />
<property name="wifeAge" />
</component>
</class>
</hibernate-mapping>
(3)设置Hibernate配置文件hibernate.cfg.cml的映射文件为Husband.hbm.xml,其他不变
<mapping resource="com/model/Husband.hbm.xml"/>
(4)运行方法一的测试类,得到相同的测试结果。
本文介绍了如何使用Annotation和映射文件在数据库中实现组件映射,通过创建Husband和Wife类,配置Hibernate配置文件,并通过测试类验证组件映射如何建表。

347

被折叠的 条评论
为什么被折叠?



