使用类一级的 @SecondaryTable或@SecondaryTables注解可以实现单个实体到多个表的映射. 使用 @Column或者 @JoinColumn注解中的table参数可指定某个列所属的特定表.
使用类一级的 @SecondaryTable或@SecondaryTables注解可以实现单个实体到多个表的映射. 使用 @Column或者 @JoinColumn注解中的table参数可指定某个列所属的特定表.
用例代码如下:
- 数据库DDL语句
1,CAT表
1 create table CAT 2 ( 3 id VARCHAR2(32 CHAR) not null, 4 create_time TIMESTAMP(6), 5 update_time TIMESTAMP(6), 6 cat_name VARCHAR2(255 CHAR), 7 first_name VARCHAR2(255 CHAR), 8 last_name VARCHAR2(255 CHAR), 9 version NUMBER(10) not null 10 )
2,CAT_INFO表
1 create table CAT_INFO 2 ( 3 address VARCHAR2(255 CHAR), 4 birthday TIMESTAMP(6), 5 cat_id VARCHAR2(32 CHAR) not null 6 )
3,CAT_INFO_2表
1 create table CAT_INFO_2 2 ( 3 gender NUMBER(10), 4 mobile VARCHAR2(255 CHAR), 5 cat_id VARCHAR2(32 CHAR) not null 6 )
- hibernate.cfg.xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE hibernate-configuration 3 PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 数据库驱动配置 --> 8 <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> 9 <property name="connection.driver_class">oracle.jdbc.OracleDriver</property> 10 <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property> 11 <property name="connection.username">wxuatuser</property> 12 <property name="connection.password">xlh</property> 13 <property name="show_sql">true</property> 14 <!-- 自动执行DDL属性是update,不是true --> 15 <property name="hbm2ddl.auto">update</property> 16 <!-- hibernate实体类 --> 17 18 <mapping class="a6_SecondaryTable.CatSecondaryTables"/> 19 20 </session-factory> 21 </hibernate-configuration>
- java类
实体类 - 基类
1 package model; 2 import java.io.Serializable; 3 import java.util.Date; 4 import javax.persistence.Column; 5 import javax.persistence.GeneratedValue; 6 import javax.persistence.Id; 7 import javax.persistence.MappedSuperclass; 8 import org.hibernate.annotations.GenericGenerator; 9 /** 10 * 实体类 - 基类 11 */ 12 @MappedSuperclass 13 public class BaseEntity implements Serializable { 14 15 private static final long serialVersionUID = -6718838800112233445L; 16 17 private String id;// ID 18 private Date create_time;// 创建日期 19 private Date update_time;// 修改日期 20 @Id 21 @Column(length = 32, nullable = true) 22 @GeneratedValue(generator = "uuid") 23 @GenericGenerator(name = "uuid", strategy = "uuid") 24 public String getId() { 25 return id; 26 } 27 public void setId(String id) { 28 this.id = id; 29 } 30 @Column(updatable = false) 31 public Date getCreate_time() { 32 return create_time; 33 } 34 public void setCreate_time(Date create_time) { 35 this.create_time = create_time; 36 } 37 public Date getUpdate_time() { 38 return update_time; 39 } 40 public void setUpdate_time(Date update_time) { 41 this.update_time = update_time; 42 } 43 @Override 44 public int hashCode() { 45 return id == null ? System.identityHashCode(this) : id.hashCode(); 46 } 47 @Override 48 public boolean equals(Object obj) { 49 if (this == obj) { 50 return true; 51 } 52 if (obj == null) { 53 return false; 54 } 55 if (getClass().getPackage() != obj.getClass().getPackage()) { 56 return false; 57 } 58 final BaseEntity other = (BaseEntity) obj; 59 if (id == null) { 60 if (other.getId() != null) { 61 return false; 62 } 63 } else if (!id.equals(other.getId())) { 64 return false; 65 } 66 return true; 67 } 68 }
实体类
1 package a6_SecondaryTable; 2 import java.util.Date; 3 import javax.persistence.AttributeOverride; 4 import javax.persistence.AttributeOverrides; 5 import javax.persistence.Column; 6 import javax.persistence.Embedded; 7 import javax.persistence.Entity; 8 import javax.persistence.PrimaryKeyJoinColumn; 9 import javax.persistence.SecondaryTable; 10 import javax.persistence.SecondaryTables; 11 import javax.persistence.Table; 12 import javax.persistence.Version; 13 import model.BaseEntity; 14 import org.hibernate.annotations.DynamicInsert; 15 import org.hibernate.annotations.DynamicUpdate; 16 17 @Entity 18 @DynamicInsert 19 @DynamicUpdate 20 @Table(name="CAT") 21 @SecondaryTables( value = { 22 @SecondaryTable(name="CAT_INFO",pkJoinColumns=@PrimaryKeyJoinColumn(name="CAT_ID")), 23 @SecondaryTable(name="CAT_INFO_2",pkJoinColumns=@PrimaryKeyJoinColumn(name="CAT_ID")) }) 24 public class CatSecondaryTables extends BaseEntity{ 25 /** 26 * 实体类 27 */ 28 private static final long serialVersionUID = -2776330321385582872L; 29 30 private String cat_name; 31 private Name name; 32 private int version; 33 private String address; 34 private Date birthday; 35 private Integer gender; 36 private String mobile; 37 38 @Version 39 public int getVersion() { 40 return version; 41 } 42 43 public void setVersion(int version) { 44 this.version = version; 45 } 46 47 public String getCat_name() { 48 return cat_name; 49 } 50 51 public void setCat_name(String cat_name) { 52 this.cat_name = cat_name; 53 } 54 55 @Embedded 56 @AttributeOverrides({ 57 @AttributeOverride(name = "first_name", column = @Column(name = "first_name")), 58 @AttributeOverride(name = "last_name", column = @Column(name = "last_name")) }) 59 public Name getName() { 60 return name; 61 } 62 63 public void setName(Name name) { 64 this.name = name; 65 } 66 @Column(name="ADDRESS", table="CAT_INFO") 67 public String getAddress() { 68 return address; 69 } 70 71 public void setAddress(String address) { 72 this.address = address; 73 } 74 @Column(name="BIRTHDAY", table="CAT_INFO") 75 public Date getBirthday() { 76 return birthday; 77 } 78 79 public void setBirthday(Date birthday) { 80 this.birthday = birthday; 81 } 82 @Column(name="GENDER", table="CAT_INFO_2") 83 public Integer getGender() { 84 return gender; 85 } 86 87 public void setGender(Integer gender) { 88 this.gender = gender; 89 } 90 @Column(name="MOBILE", table="CAT_INFO_2") 91 public String getMobile() { 92 return mobile; 93 } 94 95 public void setMobile(String mobile) { 96 this.mobile = mobile; 97 } 98 }
Dao
1 package daoUtil; 2 import org.hibernate.HibernateException; 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.cfg.Configuration; 7 import org.hibernate.service.ServiceRegistry; 8 import org.hibernate.service.ServiceRegistryBuilder; 9 10 public class HibernateUtil { 11 12 private static final SessionFactory sessionFactory; 13 14 static { 15 try { 16 Configuration cfg = new Configuration().configure(); 17 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() 18 .applySettings(cfg.getProperties()).buildServiceRegistry(); 19 sessionFactory = cfg.buildSessionFactory(serviceRegistry); 20 } catch (Throwable ex) { 21 throw new ExceptionInInitializerError(ex); 22 } 23 } 24 25 public static Session getSession() throws HibernateException { 26 return sessionFactory.openSession(); 27 } 28 29 public static Object save(Object obj){ 30 Session session = HibernateUtil.getSession(); 31 Transaction tx = null; 32 try { 33 tx = session.beginTransaction(); 34 session.save(obj); 35 tx.commit(); 36 } catch (RuntimeException e) { 37 if (tx != null) { 38 tx.rollback(); 39 } 40 throw e; 41 } finally { 42 session.close(); 43 } 44 return obj; 45 } 46 47 public static void delete(Class<?> clazz,String id){ 48 Session session = HibernateUtil.getSession(); 49 Transaction tx = null; 50 try { 51 tx = session.beginTransaction(); 52 Object obj = session.get(clazz,id); 53 session.delete(obj); 54 tx.commit(); 55 } catch (RuntimeException e) { 56 if (tx != null) { 57 tx.rollback(); 58 } 59 throw e; 60 } finally { 61 session.close(); 62 } 63 } 64 }
main
1 package a6_SecondaryTable; 2 import java.util.Date; 3 import daoUtil.HibernateUtil; 4 5 public class Test_SecondaryTables { 6 7 public static void main(String[] args) { 8 9 Name name = new Name(); 10 CatSecondaryTables cat = new CatSecondaryTables(); 11 cat.setCat_name("test7SecondaryTables2"); 12 cat.setName(name); 13 cat.setAddress("中华人民共和国"); 14 cat.setBirthday(new Date()); 15 cat.setGender(1); 16 cat.setMobile("13012345678"); 17 18 HibernateUtil.save(cat); 19 System.out.println(cat.getId()); 20 21 CatSecondaryTables cat1 = (CatSecondaryTables)HibernateUtil.getSession().get(CatSecondaryTables.class, cat.getId()); 22 System.out.println(cat1.getId()); 23 } 24 }
环境:JDK1.6,MAVEN,tomcat,eclipse
源码地址:http://files.cnblogs.com/files/xiluhua/hibernate%40SecondaryTables.rar