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

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

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

    躺在沙灘上的小豬

    快樂的每一天

    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 閱讀(1075) 評(píng)論(0)  編輯  收藏 所屬分類: javahibernate

    主站蜘蛛池模板: 免费观看久久精彩视频| 亚洲精品成人片在线观看精品字幕| 亚洲五月午夜免费在线视频| 亚洲手机中文字幕| 在线观看国产区亚洲一区成人 | 亚洲一级毛片免费看| 夜夜爽妓女8888视频免费观看| 亚洲精品二三区伊人久久| 亚洲码国产精品高潮在线| 最好免费观看韩国+日本| 亚洲三级在线免费观看| 日本高清免费观看| fc2成年免费共享视频18| 亚洲大码熟女在线观看| 国产亚洲中文日本不卡二区| 老司机亚洲精品影院| 亚洲综合国产一区二区三区| 国产乱色精品成人免费视频| 青春禁区视频在线观看直播免费 | 亚洲?V乱码久久精品蜜桃| 免费精品人在线二线三线区别| 一级毛片不卡片免费观看| 成人免费ā片在线观看| 亚洲视频在线免费| 一道本在线免费视频| 看免费毛片天天看| 四虎永久在线精品免费网址 | 亚洲色成人网一二三区| 亚洲av无码一区二区乱子伦as| 亚洲婷婷国产精品电影人久久| 波多野结衣免费视频观看| 午夜免费不卡毛片完整版| 最近2019中文字幕mv免费看| 日韩在线播放全免费| 亚洲最大免费视频网| 2021在线永久免费视频| 亚洲国产精品免费在线观看| 永久免费视频网站在线观看| 久久久久久国产精品免费无码 | 亚洲另类精品xxxx人妖| 亚洲综合一区二区|