1.为什么使用component组件?
当一个表的列数目比较多时,可以根据属性分类,将一个java对象拆分为几个对象。
数据库还是一张表,不过有多个对象与之对应。
2.实例
2.1 Java 对象:
1 public class Person { 2 3 private int id; 4 private Name name; 5 private Parents parents; 6 7 public Parents getParents() { 8 return parents; 9 } 10 11 public void setParents(Parents parents) { 12 this.parents = parents; 13 } 14 15 public int getId() { 16 return id; 17 } 18 19 public void setId(int id) { 20 this.id = id; 21 } 22 23 public Name getName() { 24 return name; 25 } 26 27 public void setName(Name name) { 28 this.name = name; 29 } 30 }
1 public class Parents { 2 private Name father; 3 private Name mother; 4 5 public Name getFather() { 6 return father; 7 } 8 9 public void setFather(Name father) { 10 this.father = father; 11 } 12 13 public Name getMother() { 14 return mother; 15 } 16 17 public void setMother(Name mother) { 18 this.mother = mother; 19 } 20 }
1 public class Name { 2 private String bigName; 3 private String nickName; 4 private int nameVersion; 5 6 public String getBigName() { 7 return bigName; 8 } 9 10 public void setBigName(String bigName) { 11 this.bigName = bigName; 12 } 13 14 public int getNameVersion() { 15 return nameVersion; 16 } 17 18 public void setNameVersion(int nameVersion) { 19 this.nameVersion = nameVersion; 20 } 21 22 public String getNickName() { 23 return nickName; 24 } 25 26 public void setNickName(String nickName) { 27 this.nickName = nickName; 28 } 29 }
2.2 Hibernate 配置文件 hibernate.cfg.xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" 5 > 6 <hibernate-configuration> 7 <session-factory> 8 <!-- Platform settings --> 9 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="connection.url">jdbc:mysql://localhost:3306/test</property> 11 <property name="connection.username">root</property> 12 <property name="connection.password">123456</property> 13 <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 14 <!-- Miscellaneous Settings --> 15 <property name="show_sql">true</property> 16 <!--mapping files--> 17 <mapping resource="test/com/hibernate/config/hbm/person.hbm.xml"/> 18 </session-factory> 19 20 </hibernate-configuration>
映射文件person.hbm.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <class name="test.com.hibernate.component.Person" table="person" lazy="false"> 7 <id name="id" column="id" type="java.lang.Integer"> 8 <generator class="native"/> 9 </id> 10 <component name="name" class="test.com.hibernate.component.Name" > 11 <property name="bigName" column="bigName" type="string"/> 12 <property name="nickName" column="nickName" type="string"/> 13 <property name="nameVersion" column="nameVersion" type="integer"/> 14 </component> 15 <component name="parents" class="test.com.hibernate.component.Parents"> 16 <component name="father" class="test.com.hibernate.component.Name"> 17 <property name="bigName" column="f_bigName" type="string"/> 18 <property name="nickName" column="f_nickName" type="string"/> 19 <property name="nameVersion" column="f_nameVersion" type="integer"/> 20 </component> 21 <component name="mother" class="test.com.hibernate.component.Name"> 22 <property name="bigName" column="m_bigName" type="string"/> 23 <property name="nickName" column="m_nickName" type="string"/> 24 <property name="nameVersion" column="m_nameVersion" type="integer"/> 25 </component> 26 </component> 27 </class> 28 </hibernate-mapping>
2.3 Hibernate 操作代码:
HibernateUtil.java
1 public class HibernateUtil { 2 static SessionFactory sessionFactory = null; 3 static{ 4 StandardServiceRegistry registry = new StandardServiceRegistryBuilder() 5 .configure("test/com/hibernate/config/hibernate.cfg.xml").build(); 6 MetadataSources sources = new MetadataSources(); 7 Metadata metadata = sources.buildMetadata(registry); 8 sessionFactory = metadata.buildSessionFactory(); 9 } 10 public static Session openSession(){ 11 if(sessionFactory==null){ 12 throw new HibernateException("session factory is null!"); 13 } 14 return sessionFactory.openSession(); 15 } 16 public static void destroy() { 17 if(sessionFactory!=null){ 18 sessionFactory.close(); 19 } 20 } 21 }
Test.java
1 public class Test { 2 3 public static void main(String[] args) { 4 5 Name name = new Name(); 6 name.setBigName("Daughter"); 7 name.setNickName("girl"); 8 name.setNameVersion(1); 9 Person person = new Person(); 10 person.setName(name); 11 12 Name father = new Name(); 13 father.setBigName("Father"); 14 father.setNickName("man"); 15 father.setNameVersion(1); 16 Name mother = new Name(); 17 mother.setBigName("Mother"); 18 mother.setNickName("woman"); 19 mother.setNameVersion(1); 20 21 Parents parents = new Parents(); 22 parents.setFather(father); 23 parents.setMother(mother); 24 25 person.setParents(parents); 26 27 PersonDao.save(person); 28 } 29 }
上述例子使用Hibernate版本为5.2Final,配置文件也可以用以前的Configuration配置。
2.4 运行结果
自动创建一个person表,并插入一条数据