用了很久的hibernate和ibatis 总结一下我对这两个框架的感悟!和解决hibernate的懒加载问题,死循环等问题
首先 我们从方便说起 hibernate提供的模板 让我们很方便的操作数据库 hibernate只需要映射对应的 实体类 对象之间的关系映射表间的关系,那么hibernate是个不错的选择
很多时候 我们都知道 hibernate的懒加载是个很让人头疼的问题 但是没办法 这样的问题总会出现 出现懒加载是因为我们的对象没被调用之前 session就已经关闭了.
解决这个问题也很简单 只需要配置fetch=FetchType.LAZY
@OneToMany(mappedBy="",targetEntity=bean.class,
cascade=CascadeType.ALL,fetch=FetchType.LAZY)
cascade=CascadeType.ALL,fetch=FetchType.LAZY)
上次的SQL监控项目 让我对hibernate的死循环 深深的感到了恐惧 发送到客户端的数据 那叫一团糟
我解决的办法是在需要过滤的model上面加上注解@JsonFilter("")
然后我再Action 通过封装的json过滤器 将实体中需要过滤的字段过滤就可以了
代码:
@Entity
@Table(name="t_application")
@JsonFilter("applicationFilter")
public class Application {
/**
* OID
*/
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="pk_id")
private int id;
/**
* 应用名称
*/
@Column(name="f_name")
private String name;
/**
* 状态(可用,禁用)
*/
@Column(name="f_state")
private String state;
/**
* 版本
*/
@Column(name="f_versions")
private String versions;
/**
* 备注
*/
@Column(name="f_remark")
private String remark;
/**
* 子系统集合
* mappedBy = "applications"是多方对应的属性
* cascade = CascadeType.ALL 级联操作
* targetEntity 集合中存放的类型
*/
@OneToMany(mappedBy="applications",targetEntity=SubSystem.class,
cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@Column(name="fk_subsystemId")
private List<SubSystem> subSystem=new ArrayList<SubSystem>();
public Application(){
}
}
在Action中我过滤要发送到客户端的数据 不需要的字段就不要写在filterOutAllExcept里面
public void jsonFilter()throws Exception{
/* //要过滤的json对象
filterProvider.addFilter("menuFilter",
SimpleBeanPropertyFilter.filterOutAllExcept("id","name","state","versions","remark",
"subSystem"));*/
//subSystem是一个集合 造成死循环的关键是在
subSystem又有一个应用节点 只要在subSystem过滤掉应用程序 那么死循环就解决了//过滤子系统 filterProvider.addFilter("SubSystemFilter",SimpleBeanPropertyFilter.filterOutAllExcept("id","name","state","versions","remark","sortcode")); om.setFilters(filterProvider);}hibernate虽然很方便 但是 对于多表之间的查询,修改等 性能是烂的 所以 hibernate的性能也是我们考虑的因素
ibatis 能够我们自己书写灵活的sql语句 但是这样就加大了程序员的操作 但是得到的却是性能上的提升
项目中的ibatis映射文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap namespace="app"> <typeAlias alias="appbean" type="com.witt.monitoring.model.Application"/> <resultMap class="appbean" id="appMap"> <result property="id" column="pk_id"/> <result property="name" column="f_name"/> <result property="state" column="f_state"/> <result property="versions" column="f_versions"/> <result property="remark" column="f_remark"/> <result property="subSystem" column="fk_subsystemId" select="subsystem.findlist"/> </resultMap> <select id="findList" resultMap="appMap"> select * from t_application where 1=1 limit #pageNo#,#pageCount#; </select> <select id="findCount" resultClass="int"> select count(*) from t_application where 1=1; </select> <select id="findById" resultMap="appMap"> select * from t_application where pk_id=#t_application#; </select> <select id="findByIdservice"> select * from t_application where pk_id=#id#; </select> <!-- 添加一个应用程序 --> <insert id="insertApplication"> INSERT INTO t_application(f_name,f_state,f_versions,f_remark,fk_subsystemId) VALUES(#app.name#,#app.state#,#app.versions#,#app.remark#,#subSystemId#); </insert> <!-- 查询所有的应用程序 --> <select id="findAllApplication" resultMap="appMap"> select * from t_application; </select> </sqlMap>