Hibernate Annotation 学习

1、一对多关联,级联操作

@OneToMany(mappedBy = "paymentad", cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = PaymentAdHistory.class)
public List<PaymentAdHistory> getPaymentHis() {
    return paymentHis;
}

PaymentAdHistory类中

@ManyToOne(cascade = { CascadeType.MERGE })
   @JoinColumn(name = "PAYMENTAD")
   @NotFound(action = NotFoundAction.IGNORE)

public PaymentAd getPaymentad() {
       return paymentad;
   }

2、刷新

Adagent aa =adagentDao.get(id);

adagentDao.getSession().refresh(aa);

3、Hibernate Annotation (Hibernate 注解)

http://www.cnblogs.com/hongten/archive/2011/07/20/2111773.html

中文说明:http://docs.jboss.org/hibernate/annotations/3.4/reference/zh_cn/html_single/

==============================================================================

CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法!

CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据!

CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据,

CascadeType.ALL:包含以上所有级联属性。

(注:以上几种级联操作,只能实在满足数据库的约束时才能生效,比如上边的Order和OrderItem存在主外键关联所以执行REMOVE()方法时是不能实现级联删除的)

CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据

2、级联删除

Hibernate一对多双向annotation配置

摘自:http://www.javaeye.com/topic/95822

school和userMember是一对多关系:

SchoolInfo.java

1import javax.persistence.CascadeType;   
2import javax.persistence.Column;   
3import javax.persistence.Entity;   
4import javax.persistence.FetchType;   
5import javax.persistence.GeneratedValue;   
6import javax.persistence.Id;   
7import javax.persistence.OneToMany;   
8import javax.persistence.Table;   
9import javax.persistence.Temporal;   
10import javax.persistence.TemporalType;   
11   
12import org.hibernate.annotations.Formula;   
13import org.hibernate.annotations.GenericGenerator;   
14   
15@Entity   
16@Table(name = "school_info")   
17public class SchoolInfo implements java.io.Serializable {   
18   
19    @Id   
20    @GeneratedValue(generator = "system-uuid")   
21    @GenericGenerator(name = "system-uuid", strategy = "uuid")   
22    private String id;//hibernate的uuid机制,生成32为字符串   
23   
24    @Column(name = "actcodeId", updatable = false, nullable = true, length = 36)   
25    private String actcodeId;   
26   
27    @Formula("select COUNT(*) from school_info")   
28    private int count;   
29   
30    @Temporal(TemporalType.TIMESTAMP)//不用set,hibernate会自动把当前时间写入   
31    @Column(updatable = false, length = 20)   
32    private Date createTime;   
33   
34    @Temporal(TemporalType.TIMESTAMP)   
35    private Date updateTime;// 刚开始我默认insertable=false,但会读取出错提示如下:   
36    // Value ‘0000-00-00‘ can not be represented as java.sql.Timestamp   
37   
38    // mappedBy="school"就相当于inverse=true,(mappedBy指定的是不需要维护关系的一端)   
39    // 应该注意的是mappedBy值对应@ManyToOne标注的属性,我刚开始写成"schoolId",让我郁闷了好一会 
40   @OneToMany(mappedBy = "school", cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = UserMember.class)   
41    // 用范性的话,就不用targetEntity了   
42    private List<usermember> users = </usermember>new ArrayList<usermember>();  </usermember> 
43       
44}   
45

@GeneratedValue(strategy=GenerationType.AUTO)我们常用的自增长机制,我这里采用的是hibernate的uuid生成机制.
需要注意的是import javax.xx.Entity ,而不是org.hibernate.xx.Entity。

郁闷的是我上面用到@Formula,生成的sql竟然是‘select COUNT(*) from school_info as formula0_ from school_info schoolinfo0_,当然不能执行了,寻求正解中~!!!!!!!!!

UserMember.java(前面引入的包已经贴过了,下面就不贴了) 

1 @Entity   
2 @Table(name = "teacher_info")//实体类和数据库表名不一致时,才用这个   
3 public class UserMember implements java.io.Serializable {   
4   
5    @Id   
6    @GeneratedValue(generator = "system-uuid")   
7    @GenericGenerator(name = "system-uuid", strategy = "uuid")   
8    private String id;   
9   
10    @Column(updatable = false, nullable = false, length = 20)   
11    private String logonName;   
12       
13    @Temporal(TemporalType.TIMESTAMP)   
14    @Column(updatable = false, length = 20)   
15    private Date createTime;   
16   
17    @Temporal(TemporalType.TIMESTAMP)   
18    private Date updateTime;   
19   
20   @ManyToOne(cascade = { CascadeType.MERGE })   
21    @JoinColumn(name = "schoolId")   
22    private SchoolInfo school;   
23    //注意该类就不用声明schoolId属性了,如果不用@JoinColumn指明关联的字段,hibernate默认会是school_id.   
24   
25 }

如果不是在delete()中可以试一下

  1. public void delete_cascade(final Movietype persistentInstance) {
  2. log.debug("deleting Movietype instance");
  3. try {
  4. getHibernateTemplate().executeFind(new HibernateCallback() {
  5. public Object doInHibernate(Session s)
  6. throws HibernateException, SQLException {
  7. s.setFlushMode(FlushMode.AUTO);
  8. s.beginTransaction().begin();
  9. s.delete(persistentInstance);
  10. s.beginTransaction().commit();
  11. s.close();
  12. return null;
  13. }
  14. });
  15. } catch (RuntimeException re) {
  16. log.error("find all failed", re);
  17. throw re;
  18. }
  19. }
时间: 2024-08-28 05:49:19

Hibernate Annotation 学习的相关文章

Rhythmk 学习 Hibernate 08 - Hibernate annotation 关联关系注解

1.一对一 (One to One)    共三种情况:     1.1 主键共享    1.2 外键共享 1.3 中间表关联 1.1  code: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Entity public class article {     @Id     @GeneratedValue    public Integer getArticleId() {         return articleId;     }     .....  

Rhythmk 学习 Hibernate 07 - Hibernate annotation 实体注解

参考: http://docs.jboss.org/hibernate/annotations/3.4/reference/zh_cn/html_single/ 1.系统配置: 可以通过使用  mapping的 resource,于class 属性混合配置 <mapping resource="com/rhythmk/model/product.hbm.xml" /> <mapping class="com.rhythmk.model.User"&

Java Annotation 学习

Java中的注解的应用越来越广泛,测试框架JUnit4, 以及Spring,Hibernate,Struts,MyBatis,JPA等等都包含了对注解的支持.在C#中的Attribute特性就是和Java中的注解是对应的.使用注解是为了编程更简便.但是我们得知道注解是做什么的,最好是能够自己的代码中可以自定义注解,提高生产率. 下面就来说一下Annotation,先说一下基本知识,然后用一个例子把这些串起来. -------------------------------------------

Hibernate Annotation关系映射, 级联cascade属性

Hibernate Annotation关系映射, 级联cascade属性一. Hibernate Annotation关系映射 1.一对一外键关联映射(单向) 2.一对一外键关联映射(双向) 3.一对一主键关联映射(不重要)在这不演示 在实际中很少用,使用注解@PrimaryKeyJoinColumn 意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用 注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML 映射可以生成.Annotation注解一对

hibernate annotation 主键生成策略的相关配置

Hibernate 默认总共支持 13 种生成策略 : 1. increment 2.  identity 3. sequence 4. hilo 5. seqhilo 6. uuid 7. uuid.hex 8. guid 9. native 10. assigned 11. select 12. foreign 13. sequence-identity 下面介绍几个较为常用的策略 : ① identity [ 自然递增 ] 支持 DB2,MySQL,SQL Server,Sybase 和H

hibernate annotation注解方式来处理映射关系

在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用annotation的方式可以更简介,所以这里就简单记录下通过annotation来配置各种映射关系,在hibernate4以后已经将annotation的jar包集成进来了,如果使用hibernate3的版本就需要引入annotation的jar包. 一.单对象操作 @Entity

Hibernate Annotation笔记

(1)简介:在过去几年里,Hibernate不断发展,几乎成为Java数据库持久性的事实标准.它非常强大.灵活,而且具备了优异的性能.在本文中,我们将了解如何使用Java 5 注释来简化Hibernate代码,并使持久层的编码过程变得更为轻松. 传统上,Hibernate的配置依赖于外部 XML 文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载.    在最近发布的几个Hibernate版本中,出现了一种基于 Java 5 注释的更为巧妙的新方法.借助新的 Hibernate

hibernate annotation生成uuid主键(id为string类型的)

hibernate annotation生成uuid主键 (2012-02-07 15:18:43) 转载▼ 标签: uuid 主键 注解 杂谈 分类: javaWeb JPA标准方式下,不可以生成uuid类型的主键,但是hibernate提供了一些方式生成uuid主键,具体方式, 1,通过注解方式生成一个generator @GenericGenerator(name="idGenerator", strategy="uuid") 2.主键生成器 @Generat

hibernate annotation映射关系详解

在hibernate中处理关系映射的方法有两种.一种是使用传统的xml来处理它们的映射关系,另一种是基于annotation的注解方式.我个人非常喜欢使用annotation,觉得这种方式显得更加的简洁,大大减少工作量.在hibernate4中annotation包无需再引入,因为已经集成了annotation包. 在讲hibernate annotation之前,我们先回想一下.在数据库创建表的时候有几个关键点是必须的.表名.字段名.字段类型.约束条件.从这些点出发我们来看看一个hiberna