躺在沙灘上的小豬

          快樂的每一天

          Hibernate Annotations(1)

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

          首先大體的來看一下:

          一:Class Level:
          1:通過@Entity聲明當前pojo為實體Bean
          2:通過@Table定義對應數據庫表的屬性
             name:表名,默認實體類名
             uniqueConstraints:定義表的唯一性約束

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

          @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都會被持久化,也就是說所有加@Transient是不會被保存到數據庫中的,所有沒有加注的默認為@Basic,通過Column我們可以更一步的定義列名,是否為空,長度,是否可更新等等屬性值,

          例:
              @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;
              }
          默認的列名就是屬性名,上面的name="userName"只是演示而已。
          password加注為@Transient,所以通過SchemaExport導入Schema,查看表結構是沒有這個字段的。

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

          @Lob
          1:所有的Clob,Character,char,String都會被轉為Clob
          2:所有的Blob,Byte[],byte[],serializable都會被轉為Blob
          例:

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


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

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

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

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

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

          @Version
          樂觀鎖

          三:跑起來
          和Hibernate官方網站一樣,來個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();
              }
          }

          創建的表結構為:

             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,明天的學習計劃.

          參考
              Hibernate Annotations Refrence

          posted on 2006-03-09 22:50 martin xus 閱讀(1076) 評論(0)  編輯  收藏 所屬分類: java 、hibernate

          主站蜘蛛池模板: 南宁市| 睢宁县| 民丰县| 襄垣县| 沙洋县| 墨竹工卡县| 鄂州市| 舟曲县| 出国| 郎溪县| 邢台市| 山阳县| 拉萨市| 昭觉县| 仪陇县| 塔河县| 鹤峰县| 山东| 福安市| 沿河| 邵阳县| 镇坪县| 岱山县| 阳朔县| 桃园市| 阿拉善左旗| 龙门县| 芒康县| 黔西| 北川| 永济市| 铁力市| 响水县| 同江市| 历史| 大足县| 自治县| 晴隆县| 仪陇县| 怀远县| 平乡县|