hibernate3 Annotation的使用(转)
注解映射必须满足两大条件:Hibernate3.2以上版本和JSEE 5。
@Entity 类注释,所有要持久化的类都要有
Java代码
?
?
@Entitypublic class Org implements java.io.Serializable {}
@Id 主键
Java代码
?
?
@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")/**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的从属类。
Java代码
?
?
@Entitypublic 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代码
?
?
@Entitypublic 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代码
?
?
@Entitypublic 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代码
?
?
@Entitypublic 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代码
?
?
@Entitypublic 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的时候就会报错!
?
?
注意import javax.xx.Entity ,而不是org.hibernate.xx.Entity。??
Descn属性不存在于数据库中,用@Transient 注明??
------------------------------------------??
1,需要: Hibernate库文件,Hibernate Annotations库,ejb3-persstence.jar(Java 持久化API)??
sessionFactory=new AnnotationConfiguration().buildSessionFactory();??
------------------------------------------??
2,<bean id="sessionFactory" ),??
@NamedQuery(name="planeType.delete",query="delete from PlaneType where id=:id" )??
?}??
)??
------------------------------------------??
内嵌对象(组件)??
@Embedded({??
?? @AttributeOverride(name='iso2', column = @Column(name='bornIso2') ),??
?? @AttributeOverride(name='name', column = @Column(name='bornCountryName') )??
???????? })??
??? Country bornIn;??
??? ...??
}??
?
@Embeddable(access = AccessType.FIELD)??
public class Address implements Serializable {??
??? String city;??
??? Country nationality;??
}??
?
?
@Embeddable??
public class Country implements Serializable {??
??? private String iso2;??
??? private String name;??
?
??? public String getIso2() { return iso2; }??
??? public void setIso2(String iso2) { this.iso2 = iso2; }??
?
??? @Column(name='countryName')??
??? public String getName() { return name; }??
??? public void setName(String name) { this.name = name; }??
??? ...??
}??
------------------------------------------??
自定义的主键生成策略??
@javax.persistence.GeneratedIdTable(??
?? name='GEN_TABLE',??
? table = @Table(name='GENERATOR_TABLE'),??
??? pkColumnName = 'key',??
????? valueColumnName = 'hi'??
)??
?
@javax.persistence.TableGenerator(??
??? name='EMP_GEN',??
??? tableName='GEN_TABLE',??
??? pkColumnValue='EMP',??
??? allocationSize=20??
)??
@javax.persistence.SequenceGenerator(??
??? name='SEQ_GEN',??
??? sequenceName='my_sequence'??
)??
package org.hibernate.test.metadata;??
?
?
?
school和userMember是一对多关系
?
?
?
@GeneratedValue(strategy=GenerationType.AUTO)我们常用的自增长机制,我这里采用的是hibernate的uuid生成机制.
?
需要注意的是import javax.xx.Entity ,而不是org.hibernate.xx.Entity。
郁闷的是我上面用到@Formula,生成的sql竟然是'select COUNT(*) from school_info as formula0_ from school_info schoolinfo0_,当然不能执行了,寻求正解中~!!!!!!!!!
UserMember.java(前面引入的包已经贴过了,下面就不贴了)
?
?
?