在使用hibernate映射数据表,如果设置太多的映射关系,如many-to-one,one-to-many,one-to-one的话则hibernate生成的hql语句太多,造成太多的数据冗余,效率太低,而且太多的字段都用不到,所以可以通过创建数据库视图的方式,在hibernate中通过对视图的映射,读取自己所需要的字段信息来进行信息的查询, 在hibernate中使用视图与普通表不太一样,因为视图没有主键,所以不能通过myEclips 的反映射视图功能对视图表进行操作, 但是可以通过自己创建hibernate的实体类与xml的映射文件来配置视图表,在设置xml映射文件时,可以通过视图表中的某个唯一字段或者identity字段来虚拟表中的主键,也就是设置xml中的id类型为identity (identity为数据库自动生成标识列,如果为其他的方式获取到主键编号,则可以设置为其他的字段类型)如:
在做视图映射的时候,在配置文件中设置的主键编号一定不能在视图表内出现重复,否则会出现查询返回的数据条数正确,但是数据却全部都是重复的,因为主键是不能重复的,配置文件只会查找主键不一致的记录, 所以推荐假设主键为其中一个最终子表的ID,那么视图表中这个字段也就不存在重复的数据了。在Hibernate中若是查询只需几个字段的数据,则可以重新定义一个新的实体类+映射表+DAO类来进行创建。
假设有个视图,内有字段:
private Integer memId; 用户的编号
private Integer regId; 用户是密码的保护设置对应的id
private String memName; 用户的登陆名
private String memNickName; 用户的昵称
private Integer memSex; 用户的性别
private Byte memStatus; 用户的状态
其中,memId 为用户信息表的主键id, regId 为用户密码保护问题表的id,regId所在的表有外键对应用户信息表的主键memId.
则在xml中的设置为:
<class name="com.myBlog.po.ViewSessionInfo" table="ViewSessionInfo" schema="dbo" catalog="BlogDB">
<id name="memId" type="java.lang.Integer"> 可以假设个主键,使用视图表中的memId字段
<column name="mem_ID" /> 视图表中的字段名
<generator class="identity"/> 设置memId的字段生成策略
</id> 其他字段的设置就和普通的表的字段设置是相同的
<property name="regId" type="java.lang.Integer">
<column name="reg_ID" />
</property>
<property name="memName" type="java.lang.String">
<column name="mem_Name" length="20" />
</property>
<property name="memNickName" type="java.lang.String">
<column name="mem_NickName" length="20" />
</property>
<property name="memSex" type="java.lang.Integer">
<column name="mem_Sex" />
</property>
<property name="memStatus" type="java.lang.Byte">
<column name="mem_Status" />
</property>
</class>
*******************************************************
ViewSessionInfo 实体类设置如下:
public class ViewSessionInfo implements java.io.Serializable { private Integer memId;
private Integer regId;
private String memName;
private String memNickName;
private Integer memSex;
private Byte memStatus;
public ViewSessionInfo() {
}
public ViewSessionInfo(Integer memId, String memName, String memNickName) {
this.memId = memId;
this.memName = memName;
this.memNickName = memNickName;
}
public ViewSessionInfo(Integer memId, Integer regId, String memName,
String memNickName, Integer memSex, Byte memStatus) {
this.memId = memId;
this.regId = regId;
this.memName = memName;
this.memNickName = memNickName;
this.memSex = memSex;
this.memStatus = memStatus;
}
public Integer getMemId() {
return this.memId;
}
public void setMemId(Integer memId) {
this.memId = memId;
}
public Integer getRegId() {
return this.regId;
}
public void setRegId(Integer regId) {
this.regId = regId;
}
public String getMemName() {
return this.memName;
}
public void setMemName(String memName) {
this.memName = memName;
}
public String getMemNickName() {
return this.memNickName;
}
public void setMemNickName(String memNickName) {
this.memNickName = memNickName;
}
public Integer getMemSex() {
return this.memSex;
}
public void setMemSex(Integer memSex) {
this.memSex = memSex;
}
public Byte getMemStatus() {
return this.memStatus;
}
public void setMemStatus(Byte memStatus) {
this.memStatus = memStatus;
}}
**************************************************
ViewSessionInfo 实体类对应的 ViewSessionInfoDAO 设置如下:
public class ViewSessionInfoDAO extends BaseHibernateDAO {
private static final Log log = LogFactory.getLog(ViewSessionInfoDAO.class);
*** 根据用户的memID来查找 ViewSessionInfo 视图表的信息 就和普通表通过主键id进行查找数据的方法是一样的**********
public ViewSessionInfo findById(java.lang.Integer id) {
log.debug("getting BlogComment instance with id: " + id);
try {
ViewSessionInfo instance = (ViewSessionInfo) getSession().get("com.myBlog.po.ViewSessionInfo", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
}//则调用findById就可以根据传输进来的id查找到所需要的视图数据了
SessionFactory代码:::::::::::::::::::::::::::::::::
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class HibernateSessionFactory {
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal threadLocal = new ThreadLocal();
private static Configuration cfg = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
private HibernateSessionFactory() {
}
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null||!session.isOpen()) {
if (sessionFactory == null) {
try{
cfg.configure(configFile);
sessionFactory=cfg.buildSessionFactory();
}catch(Exception e)
{
System.err.println("%%%%Error Creating SessionFactory%%%%");
e.getStackTrace();
}
}
session =sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null&& session.isOpen()) {
session.close();
}
}
转载自:http://chengwei2009.blog.163.com/blog/static/228683282009218102718455/