關鍵字: hibernate,annotation
基于注解的hibernate主鍵設定:@Id.
那麼它的生成規則是什麼呢?是由@GeneratedValue來規定的。
注解映射必須滿足兩大條件:Hibernate3.2以上版本和JSEE 5。
@Entity 類注釋,所有要持久化的類都要有
Java代碼
- @Entity
- public class Org implements java.io.Serializable {
- }
@Entity public class Org implements java.io.Serializable { }
@Id 主鍵
Java代碼
- @Id
- @GeneratedValue
- private String orgId;
- private String orgName;
@Id @GeneratedValue private String orgId; private String orgName;
@Column(name="...") 該屬性對應表中的字段是什麼,沒有name表示一樣
@Table 對象與表映射
@UniqueConstraint 唯一限制
@Version 方法和字段級,樂觀鎖用法,傳回數字和timestamp,數字為首選
@Transient 暫态屬性,表示不需要處理
@Basic 最基本的注釋。 有兩個屬性:fetch是否延遲加載,optional是否允許null
@Enumerated 枚舉類型
@Temporal 日期轉換。預設轉換Timestamp
@Lob 通常與@Basic同時使用,提高通路速度。
@Embeddable 類級,表可嵌入的
@Embedded 方法字段級,表被嵌入的對象和@Embeddable一起使用
@AttributeOverrides 屬性重寫
@AttributeOverride 屬性重寫的内容和@AttributeOverrides一起嵌套使用
@SecondaryTables 多個表格映射
@SecondaryTable 定義輔助表格映射和@SecondaryTables一起嵌套使用
@GeneratedValue 辨別符生成政策,預設Auto
表與表關系映射
@OneToOne:一對一映射。它包含五個屬性:
targetEntity:關聯的目标類
Cascade:持久化時的級聯操作,預設沒有
fetch:擷取對象的方式,預設EAGER
Optional:目标對象是否允許為null,預設允許
mappedBy:定義雙向關聯中的從屬類。
單向:
@JoinColumn:定義外鍵(主表會多一字段,做外鍵)
@OneToMany:一對多映射; @ManyToOne:多對一映射
單向一對多:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="book_oid")
單向多對一:
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="author_oid")
關聯表格一對多:
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(joinColumn={@JoinColumn(name="BOOK_OBJECT_OID")},inverseJoinColumns={@JoinColumn(name="AUTHER_OBJECT_OID")})
雙向一對多或多對一:
不需要多一張表,隻是使用mappedBy:使用在One一方,值為One方類名表示Many的從屬類。
Java代碼
- @Entity
- public class Org implements java.io.Serializable {
- // Fields
- @Id
- @GeneratedValue
- private String orgId;
- private String orgName;
- @OneToMany(mappedBy = "org")
- private List<Department> departments;
- // Constructors
- ...
- // Property accessors
- ...
- }
@Entity public class Org implements java.io.Serializable { // Fields @Id @GeneratedValue private String orgId; private String orgName; @OneToMany(mappedBy = "org") private List<Department> departments; // Constructors ... // Property accessors ... }
Java代碼
- @Entity
- public class Department implements java.io.Serializable {
- // Fields
- @Id
- @GeneratedValue
- private String id;
- private String name;
- @ManyToOne(fetch=FetchType.EAGER)
- @JoinColumn(name="org_orgId")
- private Org org;
- @OneToMany(mappedBy = "department")
- private List<Employee> employees;
- // Constructors
- public List<Employee> getEmployees() {
- return employees;
- }
- public void setEmployees(List<Employee> employees) {
- this.employees = employees;
- }
- public Org getOrg() {
- return org;
- }
- public void setOrg(Org org) {
- this.org = org;
- }
- .
- .
- .
- }
@Entity public class Department implements java.io.Serializable { // Fields @Id @GeneratedValue private String id; private String name; @ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name="org_orgId") private Org org; @OneToMany(mappedBy = "department") private List<Employee> employees; // Constructors public List<Employee> getEmployees() { return employees; } public void setEmployees(List<Employee> employees) { this.employees = employees; } public Org getOrg() { return org; } public void setOrg(Org org) { this.org = org; } /** default constructor */ . . . }
Java代碼
- @Entity
- public class Employee implements java.io.Serializable {
- // Fields
- @Id
- @GeneratedValue
- private String employeeId;
- private String employeeName;
- private String passWord;
- private Integer age;
- private Integer sex;
- @ManyToOne(fetch=FetchType.EAGER)
- @JoinColumn(name="department_id")
- private Department department;
- public Department getDepartment() {
- return department;
- }
- public void setDepartment(Department department) {
- this.department = department;
- }
- ...
- // Property accessors
- ...
- }
@Entity public class Employee implements java.io.Serializable { // Fields @Id @GeneratedValue private String employeeId; private String employeeName; private String passWord; private Integer age; private Integer sex; @ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name="department_id") private Department department; public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } /** default constructor */ ... // Property accessors ... }
雙向多對多:@ManyToMany.單向多對多這裡不在贅述(沒有太多實際意義)
這個比較簡單,看下代碼就明白了:
Java代碼
- @Entity
- public class Book implements java.io.Serializable {
- @Id
- private int id;
- private String name;
- private float money;
- @ManyToMany(cascade = CascadeType.ALL)
- private List<Author> authors;
- public List<Author> getAuthors() {
- return authors;
- }
- public void setAuthors(List<Author> authors) {
- this.authors = authors;
- }
- ...
- }
@Entity public class Book implements java.io.Serializable { @Id private int id; private String name; private float money; @ManyToMany(cascade = CascadeType.ALL) private List<Author> authors; public List<Author> getAuthors() { return authors; } public void setAuthors(List<Author> authors) { this.authors = authors; } ... }
Java代碼
- @Entity
- public class Author implements java.io.Serializable {
- @Id
- private int id;
- private String name;
- private int age;
- @ManyToMany(mappedBy="authors")
- private List<Book> books;
- public List<Book> getBooks() {
- return books;
- }
- public void setBooks(List<Book> books) {
- this.books = books;
- }
- ...
- }
@Entity public class Author implements java.io.Serializable { @Id private int id; private String name; private int age; @ManyToMany(mappedBy="authors") private List<Book> books; public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } ... }
總算弄完了,不過還是一個皮毛!
需要注意的是:注釋最好加在屬性上,不要加在get方法上,那樣做有時候就會出錯。比如:@ManyToMany的時候就會報錯!