hibernate+spring+springMVC部分知识点

spring包下载方法:
http://jingyan.baidu.com/article/fa4125acd8b3fb28ac70928f.html
hibernate包下载方法:
http://jingyan.baidu.com/article/e9fb46e185c0097521f76634.html
spring包下载地址:
http://repo.spring.io/libs-release-local/org/springframework/spring/




1,@Entity : 表示当前的类为实体类,声明在类的前面。可以将当前类和数据库的表和字段进行关联映射。
 
           2,@Table:表示映射的表,声明在类的前面
 
           3,@Id:表示主键的映射,声明在主键的get方法前边,默认情况下主键利用assigned(用户提供)生成策略。如果想要设置API规范提供了四种主键生成策略:
@GeneratedValue(strategy=GenerationType.AUTO)      相当于Hibernate框架的native主键生成策略
@GeneratedValue(strategy=GenerationType.IDENTITY)  相当于Hibernate框架的identity主键生成策略,适用于MySQL,SQL Server
@GeneratedValue(strategy=GenerationType.SEQUENCE)  相当于Hibernate框架的sequence主键生成策略,适用于Oracle,DB2
@GeneratedValue(strategy=GenerationType.TABLE)     使用一张单表管理主键值。
         默认情况下API规范是不支持Hibernate框架中的uuid的主键生成策略,假如我们想要使用,需要我们进行增加主键生成器,如下:
@GenericGenerator(name="hibernate-uuid",strategy="uuid")
@GeneratedValue(generator="hibernate-uuid")
 
           4,@Column : 表示映射属性,和表的字段进行关联
 
           5,@ManyToOne : 表示映射关系中的多对一
 
           6,@JoinColumn : 表示外键映射属性,和表的外键字段进行关联
 
           7,@OneToMany : 表示映射关系中的一对多,这里需要注意,一对多时,外键的维护需要翻转交给多的一方进行维护,需要配置反转属性mappedBy,属性取值为多的一方的映射属性名称。相当于xml配置文件中的Inverse="true"。
 
           8,@OrderBy : 表示排序字段
 
           9,@Transient : 表示声明瞬时属性,不和数据库的字段发生关联,也就是没有表中列与之映射。




注意:(1):如果实体类属性名与表字段名不一致的时候,要么都注解在属性前,要么都注解在get方法前。不能部分注解在属性前,部分注解在方法前。


 (2):如果实体类属性名与表字段名一致的时候,可以部分注解在属性前,部分注解在方法前。


 (3):如果在实体类中某些属性不注解:(属性和get都不写注解),默认为表字段名与实体类属性名一致。


 (4):如果实体类的某个成员属性不需要存入数据库中,使用@Transient 进行注解就可以了。即类似于:(xxx.hbm.Xml配置中的某些字段不写(就是不需要对这个成员属性进行映射))


 (5):表名称可以在实体类前进行注解。


 (6):所有这些注解在:javax.persistence包下。而不是在hibernate包中。




Spring可以通过指定classpath*:与classpath:前缀加路径的方式从classpath加载文件,如bean的定义文件.


classpath*:的出现是为了从多个jar文件中加载相同的文件.
classpath:只能加载找到的第一个文件.




   1,类的分层注解,由于我们后台开发都是分为三层进行开发的,所以Spring框架提供了三种对于不同层的注解方式:
               控制层:@Controller
               服务层:@Service
               持久层:@Repository
通用注解:@Component(不提倡)
 类似于我们配置文件中的:
<bean id="orgService" class="com.ljh.web.Service.OrgService"></bean>  


         默认情况下使用注解声明的Bean对象id名称为:类名称的首字母小写,一般不需要我们进行设置,如果想要设置时,例如我们指定的是实现类,而名字指向了接口,直接添加value属性即可:@Service(value="name"),当然value是可以省略的。
           Spring框架还为我们提供了代替上边三个分层注解的通用注解:@Component.当然提倡大家使用分层注解更好一些,区分层次比较明确。
2,自动装配功能的实现对象之间的组合关系,在属性前边指定下边的注解:
              @Autowired : 采用类型的方式完成自动装配 : byType
              @Resource : 采用名称+类型的方式完成自动装配 : byName +byType,此种方法推荐使用。
             另外Spring提供的两种注解的自动装配功能,属性不需要声明set,get方法也可以完成组合功能,这是非常方便的。
 3,在声明action时,需要指定其为多例的,解决线程安全的问题,在配置文件中我们通常会这样声明action的类:
<bean id="orgAction" class="com.ljh.web.action.OrgAction" scope="prototype"></bean>  


          而在Spring注解开发中也提供了类似的属性来解决此问题,在action类前边设定如下:
 @Scope("prototype")
 4,利用配置文件声明Dao层类时,通常是这样的:
<!-- dao层需要引用我们的sessionFactory工厂,自动装配时,  
        是会自动装配名叫sessionFactory的工厂,所以可以省略。   
    -->  
    <bean name ="orgTypeDao" class="com.ljh.dao.impl.OrgTypeDaoImpl">  
        <!--<property name="sessionFactory" ref="sessionFactory"></property>-->  
    </bean>  


           而,注解开发的方法如何进行sessionFactory的注入呢?由于Dao层继承了父类HibernateDaoSupport,而在父类中有这样一个方法:
  //父类中的sessionFactory的set注入方法  
ublic final void setSessionFactory(SessionFactory sessionFactory) {  
if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {  
    this.hibernateTemplate = createHibernateTemplate(sessionFactory);  
}  
这是sessionFactory的set注入方法,所以如果我们能够重写此方法,在此方法上进行@Resource注解,即可解决我们的问题,但是可以看到此方法是用final进行修饰的,所以通常情况下,我们采用下边的这种方法进行解决:
@Repository("orgDao")  
public class OrgDaoImpl extends HibernateDaoSupport implements OrgDao {  
  
    @Resource  
    //自定义了方法,解决了父类中final修饰不能重写的问题  
    public void setSuperSessionFactory(SessionFactory sessionFactory) {  
             //调用了父类的setSessionFactory方法  
        super.setSessionFactory(sessionFactory);  
    }  
}  


这样,Dao层的sessionFactory就进行了注入,我们可以正常编写我们的Dao层代码了。当然了对于Dao层如果我们使用了Ibatis,同样可以使用这种方法进行Ibatis核心对象sqlMapClient的注入。


spring中的事物:
TransactionDefinition接口中定义,共有7种选项可用:
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务(还不是太明白),如果当前没有事务,就新建一个事务。
TransactionDefinition中定义的隔离(isolation)级别,有5种:
1 ISOLATION_DEFAULT 默认的隔离级别
下面几个都是 JDBC isolation levels 一一对应:
2 ISOLATION_READ_UNCOMMITTED Connection.TRANSACTION_READ_UNCOMMITTED
指示防止发生脏读的常量;不可重复读和虚读有可能发生。
3 ISOLATION_READ_COMMITTED Connection.TRANSACTION_READ_COMMITTED
指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。
4 ISOLATION_REPEATABLE_READ Connection.TRANSACTION_REPEATABLE_READ
指示防止发生脏读和不可重复读的常量;虚读有可能发生。
5 ISOLATION_SERIALIZABLE Connection.TRANSACTION_SERIALIZABLE
指示防止发生脏读、不可重复读和虚读的常量。
注:
脏读 dirty reads:当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2读取的数据就可以看作是从未存在过的。
不可重复的读 non-repeatable reads:当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件。举例来说:Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。
虚读 phantom read:如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值