2008-06-27
Hibernate学习笔记
映射
1、映射中的自定义类型
________________________________________________________________________________
2、粒度问题
面向设计的
component
package org.binbin;
public class Name {
private String firstname;
private String lastname;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
}
-------------------------------
package org.binbin;
public class Contact {
private String adress;
private String zipcode;
private String tel;
public String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
--------------------------------
package org.binbin;
public class TUser {
private Integer id;
private Name name;
private Contact contact;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
}
-------------------------------------------
TUser.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.binbin.TUser" table="tuser" >
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="assigned" />
</id>
<component name="name"
class="org.binbin.Name">
<property name="firstname" type="java.lang.String">
<column name="firstname" not-null="true"/>
</property>
<property name="lastname" type="java.lang.String">
<column name="lastname" not-null="true"/>
</property>
</component>
<component name="contact">
<property name="adress" type="java.lang.String">
<column name="adress" not-null="true"/>
</property>
<property name="zipcode" type="java.lang.String">
<column name="zipcode" not-null="true"/>
</property>
<property name="tel" type="java.lang.String">
<column name="tel" not-null="true"/>
</property>
</component>
</class>
</hibernate-mapping>
面向性能的
显式多态
public class TUserInfo implements Serializable {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
TUserInfo.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>
<class name="org.binbin.TUserInfo" table="tuser">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" not-null="true" />
</property>
</class>
</hibernate-mapping>
_package org.binbin;
import java.sql.Blob;
import java.sql.Clob;
public class TUerProfile extends TUserInfo {
private Blob image;
private Clob resume;
public Blob getImage() {
return image;
}
public void setImage(Blob image) {
this.image = image;
}
public Clob getResume() {
return resume;
}
public void setResume(Clob resume) {
this.resume = resume;
}
}
TUserProfile.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class
name="org.binbin.TUserInfo"
table="tuser"
polymorphism="explicit" ><!-- 设定显式多态 -->
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" not-null="true" />
</property>
<property name="image" type="java.sql.Blob">
<column name="image" not-null="true"/>
</property>
<property name="resume" type="java.sql.Clob">
<column name="resume" not-null="true" />
</property>
</class>
</hibernate-mapping>
注意class中的polymorphism="explicit" ,只有在明确指明类名时才会被调用
________________________________________________________________________
joined-subclass
T_Item表
id int <pk>
name varchar(50)
T_Book表
id int <pk,fk> 外键对应T_Item(主表)的主键
pageCount int
T_DVD
id int <pk,fk> 外键对应T_Item(主表)的主键
regioncode varchar(30)
package org.binbin;
public class TItem {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package org.binbin;
public class TBook extends TItem {
private Integer pageCount;
public Integer getPageCount() {
return pageCount;
}
public void setPageCount(Integer pageCount) {
this.pageCount = pageCount;
}
}
package org.binbin;
public class TDVD extends TItem {
private String regioncode;
public String getRegioncode() {
return regioncode;
}
public void setRegioncode(String regioncode) {
this.regioncode = regioncode;
}
}
TItem.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.binbin.TItem" table="T_Item">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true" />
</property>
<joined-subclass name="org.binbin.TDVD" table="T_DVD">
<key>
<column name="id"></column>
</key>
<property name="regioncode" type="java.lang.String">
<column name="regioncode"></column>
</property>
</joined-subclass>
<joined-subclass name="org.binbin.TBook" table="T_Book">
<key>
<column name="id"></column>
</key>
<property name="pageCount" type="java.lang.Integer">
<column name="pageCount"></column>
</property>
</joined-subclass>
</class>
</hibernate-mapping>
_______________________________________________________________________
discriminator //增加冗余字段,一个字段决定子类
类文件同joined-subclass
表变为单一表 T_Item
id int <pk>
name varchar(50)
category varchar(20)
pageCount int
regioncode varchar(30)
TItem.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.binbin.TItem" table="T_Item" >
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true" />
</property>
<discriminator type="java.lang.String"><!-- 声明 -->
<column name="categoty" not-null="true"/>
</discriminator>
<subclass
name="org.binbin.TBook"
discriminator-value="1">
<property name="pageCount" type="java.lang.Integer">
<column name="pageCount" not-null="false"/>
</property>
</subclass>
<subclass
name="org.binbin.TDVD"
discriminator-value="2">
<property name="regioncode" type="java.lang.String">
<column name="regioncode" not-null="false"/>
</property>
</subclass>
</class>
</hibernate-mapping>
根据category 的值匹配子类
发表评论
文章已被作者锁定,不允许评论。







评论排行榜