在项目中经常会遇到类A包含类B,但类B没有自己的ID这种情况。所以在创建*.hbm.xml的时候没有必要再为类B创建自己的映射文件。具体映射关系如下:
首先看类A:
package com.mxf.bean;
public class Worker {
private int id;
private String name;
private Pay pay;
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 Pay getPay() {
return pay;
}
public void setPay(Pay pay) {
this.pay = pay;
}
}
下面是类B:
package com.mxf.bean;
public class Pay {
private int monthSal;
private int yearSal;
public int getMonthSal() {
return monthSal;
}
public void setMonthSal(int monthSal) {
this.monthSal = monthSal;
}
public int getYearSal() {
return yearSal;
}
public void setYearSal(int yearSal) {
this.yearSal = yearSal;
}
}
hibernate.cfg.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<property name="format_sql">true</property>
<mapping resource="com/mxf/bean/Worker.hbm.xml"/>
</session-factory>
</hibernate-configuration>
类A的映射文件如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-11-23 16:49:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="com.mxf.bean">
<class name="Worker" table="WORKER">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<!-- hibernate映射组件 -->
<component name="pay" class="Pay">
<property name="monthSal" column="monthSal"></property>
<property name="yearSal" column="yearSal"></property>
</component>
</class>
</hibernate-mapping>
测试文件如下:
package test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import com.mxf.bean.Pay;
import com.mxf.bean.Worker;
public class Test {
SessionFactory sessionFactory;
StandardServiceRegistry standardServiceRegistry;
Session session;
Transaction tx;
@Before
public void init(){
standardServiceRegistry = new StandardServiceRegistryBuilder().configure().build();
sessionFactory = new MetadataSources(standardServiceRegistry).buildMetadata().buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
}
@After
public void distory(){
tx.commit();
session.close();
sessionFactory.close();
StandardServiceRegistryBuilder.destroy(standardServiceRegistry);
}
@org.junit.Test
public void test() {
Worker worker = new Worker();
worker.setName("小米");
Pay pay = new Pay();
pay.setMonthSal(5000);
pay.setYearSal(10000);
worker.setPay(pay);
session.save(worker);
}
}
运行后的结果如下: