springside3里面的hibernate

http://blog.csdn.net/javaer617/article/details/6422285

springside3里面的hibernate

以springside3里面的mini-web为例子来分析。

src/main/java目录结构

src/test/java目录结构

如果需要更换数据库的话,就要改2个文件即可。

application.properties改数据库驱动,数据库源,数据库帐号密码,是否显示SQL语句等。

pom.xml是添加数据库驱动包的。

Mini-web项目用的是h2数据库,所以如果不需要更换数据库的话,把mini-web项目导入到myeclipse后再添加右击项目选中

就可以马上启动了。

Authority.java权限实体类

Role.java角色实体类

User.java用户实体类

他们都继承了IdEntity的id生成策略,里面有他们各自的一些属性,并且用annotation来创建各自的表。

以User.java为例

  1. //声明当前pojo为实体Bean  
  2. @Entity  
  3. //表名与类名不相同时重新定义表名.  
  4. @Table(name = "ACCT_USER")  
  5. //默认的缓存策略.  
  6. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  
  7. //字段非空且唯一, 用于提醒Entity使用者及生成DDL.   
  8. @Column(nullable = false, unique = true)  
  9. public String getLoginName() {  
  10.     return loginName;  
  11. }   

事实上,你既可以保持字段的持久性(注释写在成员变量之上),也可以保持属性(注释写在getter方法之上)的持久性。

 

3.常用的hibernate annotation标签如下:

@Entity              --注释声明该类为持久类。将一个Javabean类声明为一 个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解.


@Table(name="promotion_info")      --持久性映射的表(表名="promotion_info).@Table是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名.


@Id--注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。
@GeneratedValue   --定义自动增长的主键的生成策略.
@Transient            --将忽略这些字段和属性,不用持久化到数据库.适用于,在当前的持久类中,某些属性不是用于映射到数据表,而是用于其它的业务逻辑需要,这时,须将这些属性进行transient的注解.否则系统会因映射不到数据表相应字段而出错.
@Temporal(TemporalType.TIMESTAMP)--声明时间格式
@Enumerated         --声明枚举
@Version               --声明添加对乐观锁定的支持
@OneToOne            --可以建立实体bean之间的一对一的关联
@OneToMany          --可以建立实体bean之间的一对多的关联
@ManyToOne          --可以建立实体bean之间的多对一的关联
@ManyToMany        --可以建立实体bean之间的多对多的关联
@Formula               --一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)
@OrderBy               --Many端某个字段排序(List)

一对多注解:

1.

在一对多注解中,会用到:

"一"方:
@OneToMany --> mappedBy:"多"方的关联属性(被控方)
"多"方:
@ManyToOne --> @JoinColumn,"多"方定义的外键字段.

如数据表定义外键如下:

FOREIGN KEY (classid) REFERENCESclasses(id)

则:

@JoinColumn(name="classid") 

2.

在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向另一主体的关联属性。

附加说明:

mappedBy相当于过去的inverse="true".
inverse=false的side(side其实是指inverse=false所位于的class元素)端有责任维护关系,而inverse=true端无须维护这些关系。

 

多对多注解: 

在多对多注解中,双方都采用@ManyToMany.

其中被控方,像一对多注解中设置一样,也要设置mappedBy.

其中主控方,不像一对多注解那样,采用@joinColumn,而是采用@joinTable.如下:

@JoinTable(name="j_student_course",joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")})

其中,

如上所说,mappedBy,相当于inverse="true".所以,在@joinTable中的inverseJoinColumns中定义的字段为mappedBy所在类的主键.
joinColumns定义的字段,就是当前类的主键.

 

cascade与fetch使用说明:

Cascade

CascadeType.PERSIST (级联新建)
CascadeType.REMOVE  (级联删除)
CascadeType.REFRESH (级联刷新)
CascadeType.MERGE   (级联更新)中选择一个或多个。
CascadeType.ALL

fetch属性:

关联关系获取方式,即是否采用延时加载。
LAZY(默认值)采用延时加载,查询数据时,不一起查询关联对象的数据。而是当访问关联对象时才触发相应的查询操作,获取关联对象数据。
EAGER:是在查询数据时,也直接一起获取关联对象的数据。

 

每个实体类的DAO都继承了HibernateDAO,而HibernateDAO也继承了SimpleHibernateDAO,在SimpleHibernateDAO里面springside给我们提供了很多简单的增删查改的方法

T为实体类,PK为实体类的主键,参数里若有final String hql则说明用hql语句做为参数。

例如

查询唯一用户:

//获取用户

  1. user = entityDao.findUniqueBy("id", user.getId());  
 

HQL多条件查询:

//获取用户列表

  1. List<User> u = entityDao.find("from User user where user.id=? and user.name=? ", user1.getId(), user1.getName()); 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值