JPA 和hibernate-jpa-api
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import com.oa.user.form.UserInfo;
@Entity
@Table(name="file_cabinets")
public class FileCabinets {
@Id
@GeneratedValue(strategy= GenerationType.TABLE,generator="ud")
@TableGenerator(name = "ud", table = "hibernate_table", pkColumnName = "gen_pk", pkColumnValue = "1", valueColumnName = "gen_val", initialValue = 1, allocationSize = 1)
@Column(name = "fileId")
private int fileId;
@Id
@ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
@JoinColumn(name = "userId", referencedColumnName = "USER_ID")
private UserInfo userInfo;
@Column(name = "fullName")
private String fullName;
@Column(name = "extensionName")
private String extensionName;
@Column(name = "file_size")
private int fileSize;
@Column(name = "file_path")
private String filePath;
@ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
@JoinColumn(name = "file_type")
private FileCabinetsType fileCabinetsType;
public int getFileId() {
return fileId;
}
public void setFileId(int fileId) {
this.fileId = fileId;
}
public UserInfo getUserInfo() {
return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getExtensionName() {
return extensionName;
}
public void setExtensionName(String extensionName) {
this.extensionName = extensionName;
}
public int getFileSize() {
return fileSize;
}
public void setFileSize(int fileSize) {
this.fileSize = fileSize;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public FileCabinetsType getFileCabinetsType() {
return fileCabinetsType;
}
public void setFileCabinetsType(FileCabinetsType fileCabinetsType) {
this.fileCabinetsType = fileCabinetsType;
}
}
要點:Table(name="name") 這句話可以不寫,不寫就是類名作為表名
2、如果讓兩個類的屬性生成一個數據表,在這個類裡可以加入@Embedded
3如果想一個類繼承另一個類的所有屬性
@MappedSupperCclass 並把父類的所有屬性從private改為protected
1. @Id 宣告屬性為主鍵
2. @GeneratedValue表示主鍵是自動生成策略,一般該註釋和 @Id 一起使用
3. @Entity 任何 hibernte 對映物件都要有次註釋
4. @Table(name = “tablename”) 類宣告此物件對映到哪個表
5. @Column(name = “Name”,nullable=false,length=32) 宣告資料 庫欄位和類屬性對應關係
6. @Lob 宣告欄位為 Clob 或 Blob 型別
7. @OneToMany(mappedBy=”order”,cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@OrderBy(value = “id ASC”)
一對多宣告,和 ORM 產品宣告類似,一看就明白了。
@ManyToOne(cascade=CascadeType.REFRESH,optional=false)
@JoinColumn(name = “order_id”)
宣告為雙向關聯
8. @Temporal(value=TemporalType.DATE) 做日期型別轉換。
9. @OneToOne(optional= true,cascade = CascadeType.ALL, mappedBy = “person”)
一對一關聯宣告
@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true)
宣告為雙向關聯
10. @ManyToMany(mappedBy= “students”)
多對多關聯宣告。
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = “Teacher_Student”,
joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName = “teacherid”)},
inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName =
“studentid”)})
多對多關聯一般都有個關聯表,是這樣宣告的!
11. @Transiten表示此屬性與表沒有對映關係,是一個暫時的屬性
12. @Cache(usage= CacheConcurrencyStrategy.READ_WRITE)表示此物件應用快取
JPA規範
@Entity:通過@Entity註解將一個類宣告為一個實體bean
@Table:通過 @Table註解可以為實體bean對映指定表,name屬性表示實體所對應表的名稱,如果沒有定義 @Table,那麼系統自動使用預設值:實體的類名(不帶包名)
@Id:用於標記屬性的主鍵
@Column:表示持久化屬性所對映表中的欄位,如果屬性名與表中的欄位名相同,則可以省略@Column註解,另外有兩種方式標記,一是放在屬性前,另一種是放在getter方法前,例如:
@Column(name = "EMPLOYEE_NAME")
private String employee_name; 或者
@Column(name = "EMPLOYEE_NAME")
public String getEmployee_name() {
return employee_name;
} 這兩種方式都是正解的,根據個人喜好來選擇。大象偏向於第二種,並且喜歡將屬性名與欄位名設成一樣的,這樣可以省掉@Column註解,使程式碼更簡潔。
@Temporal(TemporalType.DATE):如果屬性是時間型別,因為資料表對時間型別有更嚴格的劃分,所以必須指定具體時間型別,如④所示。在javax.persistence.TemporalType列舉中定義了3種時間型別:
通過 @Temporal 定義對映到資料庫的時間精度:
@Temporal(TemporalType.DATE) 日期
@Temporal(TemporalType.TIME) 時間
@Temporal(TemporalType.TIMESTAMP) 兩者兼具
@Temporal只是起對映作為
@Transient
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Transient {}
指明一個屬性或方法不能持久化
@TableGenerator:表生成器,將當前主鍵的值單獨儲存到一個數據庫表中,主鍵的值每次都是從指定的表中查詢來獲得,這種生成主鍵的方式是很常用的。這種方法生成主鍵的策略可以適用於任何資料庫,不必擔心不同資料庫不相容造成的問題。大象推薦這種方式管理主鍵,很方便,集中式管理表的主鍵,而且更換資料庫不會造成很大的問題。各屬性含義如下:
name:表示該表主鍵生成策略的名稱,這個名字可以自定義,它被引用在@GeneratedValue中設定的"generator"值中
table:表示表生成策略所持久化的表名,說簡單點就是一個管理其它表主鍵的表,本例中,這個表名為GENERATOR_TABLE
pkColumnName:表生成器中的列名,用來存放其它表的主鍵鍵名,這個列名是與表中的欄位對應的
pkColumnValue:實體表所對應到生成器表中的主鍵名,這個鍵名是可以自定義滴
valueColumnName:表生成器中的列名,實體表主鍵的下一個值,假設EMPLOYEE表中的EMPLOYEE_ID最大為2,那麼此時,生成器表中與實體表主鍵對應的鍵名值則為3
allocationSize:表示每次主鍵值增加的大小,例如設定成1,則表示每次建立新記錄後自動加1,預設為50