andy-j2ee |
|
|||
JAVA |
公告
日歷
統計
導航常用鏈接留言簿隨筆分類(5)隨筆檔案(19)文章分類(1)文章檔案(1)搜索最新評論
閱讀排行榜評論排行榜 |
首先來看一下如何使用JPA標準定義一個Hibernate的POJO對象 1 package com.anduo.hibernate.model; 可以看到上邊的例子中多了幾個注解(annotation),其實annotation也是像java類一樣的東西,當你寫了一個注解的時候,java編譯器就會調用注解的方法來幫你做一下事情。如Entity就表示這個類是一個實體,table表示在持久化的時候的表的屬性相關聯的東西。接下來就是我們的id生成器了。2 3 import java.util.Date; 4 5 import javax.persistence.Column; 6 import javax.persistence.Entity; 7 import javax.persistence.GeneratedValue; 8 import javax.persistence.Id; 9 import javax.persistence.Table; 10 import javax.persistence.Temporal; 11 import javax.persistence.TemporalType; 12 13 @Entity 14 @Table(name="tb_student") 15 public class Student { 16 private Long id; 17 private String name; 18 private int age; 19 private Date birthday; 20 21 @Id 22 @GeneratedValue 23 @Column(name="s_id") 24 public Long getId() { 25 return id; 26 } 27 28 public void setId(Long id) { 29 this.id = id; 30 } 31 @Column(name="s_name") 32 public String getName() { 33 return name; 34 } 35 36 public void setName(String name) { 37 this.name = name; 38 } 39 40 @Column(name="s_age") 41 public int getAge() { 42 return age; 43 } 44 45 public void setAge(int age) { 46 this.age = age; 47 } 48 49 @Column(name="s_birthday") 50 @Temporal(TemporalType.DATE) 51 public Date getBirthday() { 52 return birthday; 53 } 54 55 public void setBirthday(Date birthday) { 56 this.birthday = birthday; 57 } 58 59 } 60 在你需要該列是ID的位置寫上@Id 那么該列在持久化的時候就會生成為主鍵。當然這里的主鍵建議時候包裝類型的如Integer Long 當然我在這里只復習了annotation的持久化,XML的可以參考曹小剛翻譯的hibernate文檔。 1 注意: a) 我們觀察hibernate生成表的結構并不是為了將來就用它生成,(可能還有自己的擴展,比如index等)而是為了明白我們應該建立什么樣的表和實體類映射 2 xml生成id a) generator <id name="id" > <generator class="native"></generator> </id> b) 常用四個:native identity sequence uuid 3 注解方式:@GeneratedValue a) 自定義ID b) AUTO(直接寫 @GeneratedValue 相當如native) (@GeneratedValue(strategy=GenerationType.AUTO)) i. 默認:對 MySQL,使用auto_increment ii. 對 Oracle使用hibernate_sequence(名稱固定) c) IDENTITY(@GeneratedValue(strategy=GenerationType.IDENTITY)) d) SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE)) i. @SequenceGenerator(可自定義在數據庫生成指定的sequence名) @Id //在@GeneratedValue中增加 generator="teacherSEQ" @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ") //"teacherSEQ"為@SequenceGenerator的標識名 //"teacherSEQ_DB"為指定到數據庫生成的Sequence名 @SequenceGenerator(name="teacherSEQ", sequenceName="teacherSEQ_DB") public int getId() { return id; } e) TABLE (可以忘記) i. @TableGenerator @TableGenerator( name="teacherID", //被調用的TABLE名字 table="teacherID_DB", //數據庫建立的表名 pkColumnName="key_value", pkColumnValue="pk_value", valueColumnName="teacher", //pkColumnValue對應類名 allocationSize=1 //pkColumnValue對應類名 )
@GeneratedValue(strategy=GenerationType.TABLE,generator=" teacherID ")
注:如果使用注解方式的uuid 如下: @Id @GeneratedValue(generator="teacherUUID") @GenericGenerator(name="teacherUUID", strategy="uuid") 4 FAQ; a) 用Junit測試時Hibernate Session Factory初始化異常不提示.疑似一個bug b) 用main來做測試 5 聯合主鍵 a) Xml方式: composite-id i. 將聯合主鍵的屬性提取出來,重新編寫一個pojo類(原pojo類中的id,name要刪除 并新加入屬性“StudentPK”) public class StudentPK implements Serializable { private String id; private String name; … … ii. 新建pojo類必須實現 java.io.Serializable 序列化接口 iii. 新pojo類要重寫equals和hashCode方法 @Override public boolean equals(Object o) { if(o instanceof StudentPk) { StudentPk pk = (StudentPk)o; if(this.id == pk.getId() && this.name.equals(pk.getName())) { return true; } } return false; }
@Override public int hashCode() { return this.name.hashCode(); } iv. 聯合主鍵生成策略XML配置方法 <hibernate-mapping> <class name="com.bjsxt.pojo.Student" > <composite-id name="studentPK" class="com.bjsxt.pojo.StudentPK"> <key-property name="id"></key-property> <key-property name="name"></key-property> </composite-id> <property name="age" /> <property name="sex" /> <property name="good" type="yes_no"></property> </class> </hibernate-mapping>
b) Annotation i. 前三步與Xml方式前三步一樣 都要建立新pojo類 都要實現Serializable接口 重寫equals和hashCode方法. ii. 方法1在新類前寫@Embeddable,在原pojo類的新屬性“TercherPK”的get方法前寫@ld,如下 @ Embeddable public class TeacherPK implements Serializable { private String id; private String name; … …
@Entity public class Teacher { private TeacherPK teacherPK ; @Id public TeacherPK getTeacherPK() { return teacherPK; } … … iii. 方法2:@EmbeddedlD(*) 新pojo類無需加注解,只需在原pojo類新屬性“TercherPK”的get方法前寫@EmbeddedlD即可 iv. 方法3:@Id @IdClass(*) 新pojo類無需加注解,原pojo類的id,name屬性保留不變,也無需新增“TercherPK”屬性。 只在id,name的get方法前都加@Id,并在原pojo類前加“@IdClass(TeacherPK).class)”,如下 @Entity @IdClass(TeacherPK.class) public class Teacher { private String id; private String name; @Id public String getId() { return id; } @Id public String getName() { return name; } ... ...
|
![]() |
|
Copyright © 安多 | Powered by: 博客園 模板提供:滬江博客 |