<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    躺在沙灘上的小豬

    快樂的每一天

    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 閱讀(1078) 評論(0)  編輯  收藏 所屬分類: java 、hibernate

    主站蜘蛛池模板: 亚洲免费在线观看| 亚洲а∨天堂久久精品9966| 免费看一级毛片在线观看精品视频| 野花高清在线观看免费3中文| 亚洲国产成人私人影院| 国产一级一毛免费黄片| 亚洲综合精品香蕉久久网| 中文字幕免费在线看线人动作大片| 亚洲AⅤ无码一区二区三区在线 | 一日本道a高清免费播放| 亚洲国产成人精品无码久久久久久综合 | 全免费a级毛片免费看| 国产大片免费观看中文字幕| 中文字幕精品三区无码亚洲| 女人张开腿等男人桶免费视频| 亚洲视频在线观看2018| 成人爽A毛片免费看| 亚洲av日韩综合一区二区三区| 国产成人免费a在线资源| 全黄A免费一级毛片| 亚洲人成图片小说网站| 99精品视频在线视频免费观看| 亚洲性无码av在线| 国产美女被遭强高潮免费网站| 无遮挡a级毛片免费看| 中文字幕亚洲天堂| 在线观看免费中文视频| 亚洲真人无码永久在线观看| 国产成人免费高清在线观看| 亚洲精品视频免费| 91亚洲自偷手机在线观看| 女人被男人桶得好爽免费视频| 美女被羞羞网站免费下载| 亚洲AV中文无码字幕色三| 无遮免费网站在线入口| 精品国产亚洲第一区二区三区| 亚洲精品国精品久久99热一| 在线看片免费不卡人成视频| 免费一区二区三区在线视频| 亚洲人成电影亚洲人成9999网| 成人免费毛片内射美女APP|