天天看点

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 注解)

<a href="http://www.cnblogs.com/hongten/archive/2011/07/20/2111773.html" target="_blank">http://www.cnblogs.com/hongten/archive/2011/07/20/2111773.html</a>

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

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

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

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

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

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

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

2、级联删除

<a href="http://www.blogjava.net/jiafang83/archive/2009/07/26/288438.html" target="_blank">Hibernate一对多双向annotation配置</a>

school和userMember是一对多关系:

SchoolInfo.java

1

Hibernate Annotation 学习

import javax.persistence.CascadeType;   

2

Hibernate Annotation 学习

import javax.persistence.Column;   

3

Hibernate Annotation 学习

import javax.persistence.Entity;   

4

Hibernate Annotation 学习

import javax.persistence.FetchType;   

5

Hibernate Annotation 学习

import javax.persistence.GeneratedValue;   

6

Hibernate Annotation 学习

import javax.persistence.Id;   

7

Hibernate Annotation 学习

import javax.persistence.OneToMany;   

8

Hibernate Annotation 学习

import javax.persistence.Table;   

9

Hibernate Annotation 学习

import javax.persistence.Temporal;   

10

Hibernate Annotation 学习

import javax.persistence.TemporalType;   

11

Hibernate Annotation 学习

12

Hibernate Annotation 学习

import org.hibernate.annotations.Formula;   

13

Hibernate Annotation 学习

import org.hibernate.annotations.GenericGenerator;   

14

Hibernate Annotation 学习

15

Hibernate Annotation 学习

@Entity   

16

Hibernate Annotation 学习

@Table(name = "school_info")   

17

Hibernate Annotation 学习

public class SchoolInfo implements java.io.Serializable {   

18

Hibernate Annotation 学习

19

Hibernate Annotation 学习

    @Id   

20

Hibernate Annotation 学习

    @GeneratedValue(generator = "system-uuid")   

21

Hibernate Annotation 学习

    @GenericGenerator(name = "system-uuid", strategy = "uuid")   

22

Hibernate Annotation 学习

    private String id;//hibernate的uuid机制,生成32为字符串   

23

Hibernate Annotation 学习

24

Hibernate Annotation 学习

    @Column(name = "actcodeId", updatable = false, nullable = true, length = 36)   

25

Hibernate Annotation 学习

    private String actcodeId;   

26

Hibernate Annotation 学习

27

Hibernate Annotation 学习

    @Formula("select COUNT(*) from school_info")   

28

Hibernate Annotation 学习

    private int count;   

29

Hibernate Annotation 学习

30

Hibernate Annotation 学习

    @Temporal(TemporalType.TIMESTAMP)//不用set,hibernate会自动把当前时间写入   

31

Hibernate Annotation 学习

    @Column(updatable = false, length = 20)   

32

Hibernate Annotation 学习

    private Date createTime;   

33

Hibernate Annotation 学习

34

Hibernate Annotation 学习

    @Temporal(TemporalType.TIMESTAMP)   

35

Hibernate Annotation 学习

    private Date updateTime;// 刚开始我默认insertable=false,但会读取出错提示如下:   

36

Hibernate Annotation 学习

    // Value '0000-00-00' can not be represented as java.sql.Timestamp   

37

Hibernate Annotation 学习

38

Hibernate Annotation 学习

    // mappedBy="school"就相当于inverse=true,(mappedBy指定的是不需要维护关系的一端)   

39

Hibernate Annotation 学习

    // 应该注意的是mappedBy值对应@ManyToOne标注的属性,我刚开始写成"schoolId",让我郁闷了好一会 

40

Hibernate Annotation 学习

   @OneToMany(mappedBy = "school", cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = UserMember.class)   

41

Hibernate Annotation 学习

    // 用范性的话,就不用targetEntity了   

42

Hibernate Annotation 学习

    private List&lt;usermember&gt; users = &lt;/usermember&gt;new ArrayList&lt;usermember&gt;();  &lt;/usermember&gt; 

43

Hibernate Annotation 学习

44

Hibernate Annotation 学习

}   

45

Hibernate Annotation 学习

@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()中可以试一下

public void delete_cascade(final Movietype persistentInstance) {  

   log.debug("deleting Movietype instance");  

   try {  

       getHibernateTemplate().executeFind(new HibernateCallback() {  

           public Object doInHibernate(Session s)  

                   throws HibernateException, SQLException {  

               s.setFlushMode(FlushMode.AUTO);  

               s.beginTransaction().begin();  

               s.delete(persistentInstance);  

               s.beginTransaction().commit();  

               s.close();  

               return null;  

           }  

       });  

   } catch (RuntimeException re) {  

       log.error("find all failed", re);  

       throw re;  

   }  

本文转自追光的猫博客51CTO博客,原文链接http://blog.51cto.com/ql0722/1655987如需转载请自行联系原作者

00_yatou