企业级开发对实现层操作的解决方案
企业级应用需要解决并发,交互,事务,集群,安全,分布式,WEB的一系列问题。
什么是EJB
由EJB(企业级javabean)服务主要提供生命周期管理、代码产生、持续性管理、安全、事务管理、锁和并发性管理等服务。
EJB提供会话BEAN。消息驱动BEAN。
什么是J2EE
- J2EE是一套设计、。开发、汇编和部署企业应用程序的规范。
- J2EE提供了企业级应用程序的开发平台,提供了多层结构,分布式、基于组件、松耦合、安全可靠、独立于平台且反应迅速的应用程序环境。
J2EE包括的组件技术
- JSP:J2EE的web层核心技术
- Servlet:j2EE的WEB层核心技术
- JDBC:数据库访问技术
- XML:跨平台的可扩展标记语言
- EJB:J2EE的业务层核心技术
- JNDI:java命名和目录接口
- JMS:JAVA消息服务
- JTA和JTS:JAVA事务管理
- JavaMail:邮件收发
- RMI:远程方法调用
- IDL:接口定义语言,将JAVA和CORBA集成的一种技术
框架的重量
- 重量级框架:启动,测试,运行都不能离开容器单独进行。依赖性强。
- 轻量级框架:SUN提出容器提供服务,轻量级框架提供同样的服务,用来支持POJO。通过代理方式实现服务的附加。用轻量级框架,持久层和业务层可以单独测试。
spring框架:
- 表现层:struts1,struts2,webwork,springMVC
- 业务层
- 持久层:hibernate,mybatis,jdo,EJB实体Bean
- DB
O/R Mapping
对象-关系映射是一门非常实用的工程技术,它实现了JAVA应用中的对象到关系数据库中的表的自动的(和透明的)持久化,实用元数据(meta data)描述对象与数据库间的映射。
O/R Mapping的优点
- 提供生产率
- 可维护性
- 更好性能
Hibernate特点
- 是一种开放源代码的对象/关系映射持久层框架
- 事务处理,生命周期管理不依赖于J2EE容器
- 解决数据库的方言问题
- hbernate只需要操作对象就可以完成数据库的增、删、改、查操作。使用hibernate更面向对象
- 轻量级,无侵入性,移植性很好。
ssh
- struts撑杆
- hibernate:冬眠
- spring:春天
hibernate应用范围
不适用于:
- 批量对对象进行操作
- 使用数据库特定映射
- 表间关系很复杂时,会造成性能问题
主键生成策略
- increment(自动增长,其主键由hibernate控制,数据库中响应的字段没有设置自动增长,不能用于集群)
- identity(自动增长,对DB2,Mysql,sql server数据库中响应的字段设置自动增长)
- sequence(对Oracle数据库中响应的字段设置自动增长)
- UUID:采用UUID算法生成字符串唯一标识,UUID生成策略相对来说较快,不需要使用数据库相关的维护表的操作,但查找相对较慢
- native(根据数据库底层的描述,决定采用identity,sequence中的一个)
- assigned:手动分配主键,当generator没有设置时,采用这种方式
- select:使用触发器分配主键
- foreign:使用另外一个相关联的对象的标识符。通常和联合起来使用
oracle序列添加主键生成策略
<id name="custld">
<generator class="sequence">
S_CUST_ID为序列名称
<param name="sequence">S_CUST_ID</param>
</generator>
</id>
对象的状态
- Transient(瞬时状态):当生成PO对象时产生,数据库中没有相应的记录,没有session对其进行管理
- persistent(持久状态):当session对象调用saveorupdate()时,数据库汇总有与之对应的记录,有session对象对峙进行管理,当PO对象的值发生变化时,session对象让数据库记录与之同步
- Detached(游离状态):当session事务提交时,数据库中有与之对应的记录,从session一级缓存中清除,session对其不再进行管理
hibernate中get和load的区别
- get为立即加载,调用get方法时,会马上执行SQL将结果查询出来。
load为延迟加载,调用load方法时,不会马上查询结果。而是当查询出来的对象在使用时才发出SQL语句查询结果。 - 当查询的主键不存在时,get方法返回null,load方法会抛出“对象为找到异常”。
注意:对延迟加载而言。一旦查询的对象不适用,不会真正查询数据库。这时,如果session关闭,再使用查询的对象,那么会抛出org.hebernate.lazyInitializationException异常
数据库表一对一关系的两种方式:
- 主键关联:从表的主键,同时又是主表的外键。从表没有单独的外键列。
- 外键关联:从表中存在外键列,关联柱表的主键列。但外键列是不重复的。
级联操作
<one-to-one name="card"
class="com.demo.model.Card"
cascade="all"
cascade中的all,none,delete,save-update几种关键字,表示主表发生的操作从表同样进行
cascade和inverse的区别
- cascade表示级联操作,当主表记录做操作时,从表记录做相应的操作,维护的是记录。
- inverse表示控制反转。当该属性设置为真时,表示由关联对象维护外键关系,当前对象不做外键维护,维护的是外键。一般来说,inverse设置在一方,外键由从表维护。