可以看到上邊的例子中多了幾個注解(annotation),其實annotation也是像java類一樣的東西,當你寫了一個注解的時候,java編譯器就會調用注解的方法來幫你做一下事情。如Entity就表示這個類是一個實體,table表示在持久化的時候的表的屬性相關聯的東西。接下來就是我們的id生成器了。
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;
}
... ...