[color=red]注解映射必须满足两大条件:Hibernate3.2以上版本和JSEE 5。[/color]
[b]@Entity[/b] 类注释,所有要持久化的类都要有
[code]@Entity
public class Org implements java.io.Serializable {
}[/code]
[b]@Id[/b] 主键
[code]@Id
@GeneratedValue
private String orgId;
private String orgName;[/code]
[b]@Column(name="...")[/b] 该属性对应表中的字段是什么,没有name表示一样
[b]@Table[/b] 对象与表映射
[b]@UniqueConstraint[/b] 唯一约束
[b]@Version[/b] 方法和字段级,乐观锁用法,返回数字和timestamp,数字为首选
[b]@Transient[/b] 暂态属性,表示不需要处理
[b]@Basic[/b] 最基本的注释。有两个属性:fetch是否延迟加载,optional是否允许null
[b]@Enumerated[/b] 枚举类型
[b]@Temporal[/b] 日期转换。默认转换Timestamp
[b]@Lob[/b] 通常与@Basic同时使用,提高访问速度。
[b]@Embeddable[/b] 类级,表可嵌入的
[b]@Embedded[/b] 方法字段级,表被嵌入的对象和@Embeddable一起使用
[b]@AttributeOverrides[/b] 属性重写
[b]@AttributeOverride[/b] 属性重写的内容和@AttributeOverrides一起嵌套使用
[b]@SecondaryTables[/b] 多个表格映射
[b]@SecondaryTable[/b] 定义辅助表格映射和@SecondaryTables一起嵌套使用
[b]@GeneratedValue[/b] 标识符生成策略,默认Auto
表与表关系映射
[b]@OneToOne[/b]:一对一映射。它包含五个属性:
targetEntity:关联的目标类
Cascade:持久化时的级联操作,默认没有
fetch:获取对象的方式,默认EAGER
Optional:目标对象是否允许为null,默认允许
mappedBy:定义双向关联中的从属类。
单向:
@JoinColumn:定义外键(主表会多一字段,做外键)
[b]@OneToMany[/b]:一对多映射;[b]@ManyToOne[/b]:多对一映射
单向一对多:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="book_oid")/**book:表;oid:book表的主键;无name会按此规则自动生成*/
单向多对一:
@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的从属类。
[code]@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
...
}[/code]
[code]@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 */
.
.
.
}[/code]
[code]@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
...
}[/code]
双向多对多:@ManyToMany.单向多对多这里不在赘述(没有太多实际意义)
这个比较简单,看下代码就明白了:
[code]@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;
}
...
}[/code]
[code]
@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;
}
...
}[/code]
总算弄完了,不过还是一个皮毛!
需要注意的是:注释最好加在属性上,不要加在get方法上,那样做有时候就会出错。比如:@ManyToMany的时候就会报错!
[b]@Entity[/b] 类注释,所有要持久化的类都要有
[code]@Entity
public class Org implements java.io.Serializable {
}[/code]
[b]@Id[/b] 主键
[code]@Id
@GeneratedValue
private String orgId;
private String orgName;[/code]
[b]@Column(name="...")[/b] 该属性对应表中的字段是什么,没有name表示一样
[b]@Table[/b] 对象与表映射
[b]@UniqueConstraint[/b] 唯一约束
[b]@Version[/b] 方法和字段级,乐观锁用法,返回数字和timestamp,数字为首选
[b]@Transient[/b] 暂态属性,表示不需要处理
[b]@Basic[/b] 最基本的注释。有两个属性:fetch是否延迟加载,optional是否允许null
[b]@Enumerated[/b] 枚举类型
[b]@Temporal[/b] 日期转换。默认转换Timestamp
[b]@Lob[/b] 通常与@Basic同时使用,提高访问速度。
[b]@Embeddable[/b] 类级,表可嵌入的
[b]@Embedded[/b] 方法字段级,表被嵌入的对象和@Embeddable一起使用
[b]@AttributeOverrides[/b] 属性重写
[b]@AttributeOverride[/b] 属性重写的内容和@AttributeOverrides一起嵌套使用
[b]@SecondaryTables[/b] 多个表格映射
[b]@SecondaryTable[/b] 定义辅助表格映射和@SecondaryTables一起嵌套使用
[b]@GeneratedValue[/b] 标识符生成策略,默认Auto
表与表关系映射
[b]@OneToOne[/b]:一对一映射。它包含五个属性:
targetEntity:关联的目标类
Cascade:持久化时的级联操作,默认没有
fetch:获取对象的方式,默认EAGER
Optional:目标对象是否允许为null,默认允许
mappedBy:定义双向关联中的从属类。
单向:
@JoinColumn:定义外键(主表会多一字段,做外键)
[b]@OneToMany[/b]:一对多映射;[b]@ManyToOne[/b]:多对一映射
单向一对多:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="book_oid")/**book:表;oid:book表的主键;无name会按此规则自动生成*/
单向多对一:
@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的从属类。
[code]@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
...
}[/code]
[code]@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 */
.
.
.
}[/code]
[code]@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
...
}[/code]
双向多对多:@ManyToMany.单向多对多这里不在赘述(没有太多实际意义)
这个比较简单,看下代码就明白了:
[code]@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;
}
...
}[/code]
[code]
@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;
}
...
}[/code]
总算弄完了,不过还是一个皮毛!
需要注意的是:注释最好加在属性上,不要加在get方法上,那样做有时候就会出错。比如:@ManyToMany的时候就会报错!