Hibernate Annotations(1)
今天有時間大體看了一下Hibernate Annotations,決定放棄xdoclet生成hbm的想法,開始學習annotation.
首先大體的來看一下:
一:Class Level:
1:通過@Entity聲明當前pojo為實體Bean
2:通過@Table定義對應數據庫表的屬性
name:表名,默認實體類名
uniqueConstraints:定義表的唯一性約束
例:定義表名為tb_user,并且用戶名唯一,不能重復














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



















password加注為@Transient,所以通過SchemaExport導入Schema,查看表結構是沒有這個字段的。
@Temporal
日期類型,分三種,Time,Date,Timestamp
例:






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













@Id
就是標識了,暫時還沒有詳讀文檔,看了一下test
最簡單方式如下:







我看了一下mysql生成的sql


應該是hibernate根據數據庫類型自動選擇的(說了一句廢話

當然我們可以根據我們需要選擇其他的生成方式,例如常用的uuid








@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(true, true, false, true);
sessionFactory = cfg.buildSessionFactory();
}
public static Session getSession() {
return sessionFactory.openSession();
}
}
* @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();
}
}
* @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();
}
}
創建的表結構為:











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

























































































四:next,明天的學習計劃.
參考
Hibernate Annotations Refrence
posted on 2006-03-09 22:50 martin xus 閱讀(1076) 評論(0) 編輯 收藏 所屬分類: java 、hibernate