今天有時(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(true, true, false, true);
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(32) not null,
birthday datetime,
resume text,
image blob,
optlock integer,
password varchar(255),
userName varchar(80) not 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