躺在沙灘上的小豬

          快樂的每一天

          Hibernate Annotations(1)

          今天有時(shí)間大體看了一下Hibernate Annotations,決定放棄xdoclet生成hbm的想法,開始學(xué)習(xí)annotation.

          首先大體的來看一下:

          一:Class Level:
          1:通過@Entity聲明當(dāng)前pojo為實(shí)體Bean
          2:通過@Table定義對(duì)應(yīng)數(shù)據(jù)庫表的屬性
             name:表名,默認(rèn)實(shí)體類名
             uniqueConstraints:定義表的唯一性約束

          例:定義表名為tb_user,并且用戶名唯一,不能重復(fù)

          @Entity
          @Table(
                  name 
          = "tb_user",
                  uniqueConstraints 
          =
                          
          {@UniqueConstraint(columnNames = "userName")}
          )
          public class User implements Serializable {
              
          private Integer id;
              
          private String userName;
          }

          二:Method Level:
          @Basic
          @Transient
          @Column
          所有非static非transient都會(huì)被持久化,也就是說所有加@Transient是不會(huì)被保存到數(shù)據(jù)庫中的,所有沒有加注的默認(rèn)為@Basic,通過Column我們可以更一步的定義列名,是否為空,長(zhǎng)度,是否可更新等等屬性值,

          例:
              @Column(name = "userName", nullable = false, length = 80, unique = true)
              
          public String getUserName() {
                  
          return userName;
              }


              
          public void setUserName(String userName) {
                  
          this.userName = userName;
              }


              @Transient
              
          public String getPassword() {
                  
          return password;
              }
          默認(rèn)的列名就是屬性名,上面的name="userName"只是演示而已。
          password加注為@Transient,所以通過SchemaExport導(dǎo)入Schema,查看表結(jié)構(gòu)是沒有這個(gè)字段的。

          @Temporal
          日期類型,分三種,Time,Date,Timestamp
          例:
              @Temporal(TemporalType.TIMESTAMP)
              
          public Date getBirthday() {
                  
          return birthday;
              }

          @Lob
          1:所有的Clob,Character,char,String都會(huì)被轉(zhuǎn)為Clob
          2:所有的Blob,Byte[],byte[],serializable都會(huì)被轉(zhuǎn)為Blob
          例:

              @Lob
              
          public Clob getResume() {
                  
          return resume;
              }


              @Lob
              
          public Blob getImage() {
                  
          return image;
              }

          @Id
          就是標(biāo)識(shí)了,暫時(shí)還沒有詳讀文檔,看了一下test
          最簡(jiǎn)單方式如下:
              @Id
              @GeneratedValue
              
          public String getId() {
                  
          return id;
              }

          我看了一下mysql生成的sql
           
          id integer not null auto_increment,
          primary key (id),

          應(yīng)該是hibernate根據(jù)數(shù)據(jù)庫類型自動(dòng)選擇的(說了一句廢話 ),我猜是生成方式native
          當(dāng)然我們可以根據(jù)我們需要選擇其他的生成方式,例如常用的uuid

              @Id
              @GeneratedValue(generator 
          = "system-uuid")
              @GenericGenerator(name 
          = "system-uuid", strategy = "uuid")
              
          public Integer getId() {
                  
          return id;
              }

          @Version
          樂觀鎖

          三:跑起來
          和Hibernate官方網(wǎng)站一樣,來個(gè)HibernateUtil

          /**
           * 
          @author martin
           
          */
          public class HibernateUtil {
              
          private static final SessionFactory sessionFactory;

              
          static {
                  AnnotationConfiguration cfg 
          =
                          
          new AnnotationConfiguration().addAnnotatedClass(User.class);
                  
          new SchemaExport(cfg).execute(truetruefalsetrue);
                  sessionFactory 
          = cfg.buildSessionFactory();
              }

              
          public static Session getSession() {
                  
          return sessionFactory.openSession();
              }
          }

          注意這里的 new AnnotationConfiguration()!

          Test:

          /**
           * 
          @author martin
           
          */

          public class HibernateUtilTest extends TestCase {
              
          public void
           testAddUser() {
                  User user 
          = new
           User();
                  user.setUserName(
          "martin"
          );
                  save(user);
                  assertNotNull(user.getId());
              }

              
          public void
           testUpdateUser() {
                  Session session 
          =
           HibernateUtil.getSession();
                  Query query 
          =

                          session.createQuery(
          "from User as user where user.userName=:name");
                  query.setParameter(
          "name""martin"
          );
                  List list 
          =
           query.list();
                  session.close();
                  assertEquals(
          1
          , list.size());

                  User user 
          = (User) list.get(0
          );
                  user.setUserName(
          "martin xus"
          );
                  save(user);
                  assertEquals(
          new Integer(1
          ), user.getVersion());
              }

              
          private void
           save(User user) {
                  Session session 
          =
           HibernateUtil.getSession();
                  Transaction tx 
          =
           session.beginTransaction();
                  session.saveOrUpdate(user);
                  session.flush();
                  tx.commit();
                  session.close();
              }
          }

          創(chuàng)建的表結(jié)構(gòu)為:

             create table tb_user (
                  id 
          varchar(32not null,
                  birthday 
          datetime,
                  resume 
          text,
                  
          image blob,
                  optlock 
          integer,
                  password 
          varchar(255),
                  userName 
          varchar(80not null unique,
                  
          primary key (id),
                  
          unique (userName)
              )


          完整User代碼(省掉了所有屬性的setter):

          import org.hibernate.annotations.GenericGenerator;

          import javax.persistence.*;
          import java.io.Serializable;
          import java.util.Date;
          import java.sql.Clob;
          import java.sql.Blob;

          /**
           * 
          @author martin
           
          */

          @Entity
          @Table(
                  name 
          = "tb_user",
                  uniqueConstraints 
          =
                          
          {@UniqueConstraint(columnNames = "userName")}
          )
          public class User implements Serializable {
              
          private String id;
              
          private String userName;
              
          private String password;
              
          private Date birthday;
              
          private Clob resume;
              
          private Blob image;
              
          private Integer version;

              @Id
              @GeneratedValue(generator 
          = "system-uuid")
              @GenericGenerator(name 
          = "system-uuid", strategy = "uuid")
              @Column(length 
          = 32)
              
          public String getId() {
                  
          return id;
              }


              @Column(nullable 
          = false, length = 80, unique = true)
              
          public String getUserName() {
                  
          return userName;
              }



              
          public String getPassword() {
                  
          return password;
              }



              @Temporal(TemporalType.TIMESTAMP)
              
          public Date getBirthday() {
                  
          return birthday;
              }



              @Version
              @Column(name 
          = "optlock")
              
          public Integer getVersion() {
                  
          return version;
              }



              @Lob
              
          public Clob getResume() {
                  
          return resume;
              }


              @Lob
              
          public Blob getImage() {
                  
          return image;
              }

               
              
          //setter
          }

          四:next,明天的學(xué)習(xí)計(jì)劃.

          參考
              Hibernate Annotations Refrence

          posted on 2006-03-09 22:50 martin xus 閱讀(1078) 評(píng)論(0)  編輯  收藏 所屬分類: javahibernate

          主站蜘蛛池模板: 邻水| 营口市| 巧家县| 宝坻区| 军事| 准格尔旗| 宜都市| 天台县| 上思县| 宁阳县| 玉溪市| 五寨县| 浑源县| 红桥区| 烟台市| 林甸县| 油尖旺区| 昌图县| 古交市| 乌鲁木齐县| 南投县| 永州市| 长兴县| 育儿| 西林县| 达尔| 仙桃市| 连山| 茂名市| 宽甸| 闸北区| 蒲江县| 昆山市| 浠水县| 西吉县| 靖州| 略阳县| 安国市| 抚松县| 西乌珠穆沁旗| 全南县|