Hibernate Annotation 学习

  1. 云栖社区>
  2. 博客>
  3. 正文

Hibernate Annotation 学习

技术小阿哥 2017-11-27 10:57:00 浏览512
展开阅读全文

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);


3Hibernate 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

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


@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.    }  


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

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注