Hibernate 注解试用

来源:互联网 发布:区域高程数据 编辑:程序博客网 时间:2024/05/16 07:56

简述:

记录 Hibernate的JPA(Java Persistence API) 注解的部分用法


内容:

1. 由于数据库中,每张表都有ID属性,所以方便起见,在做Hibernate持久化的时候,不妨让所有持久化对象都继承同一个IDEntity

IDEnitty.java类,其中ID是通过UUID方法,自动生成的

@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement@MappedSuperclasspublic class IDEntity implements Serializable {/** *  */private static final long serialVersionUID = 7245926530433395470L;    @Id    @Column(name ="ID", nullable = false, unique = true)    @GeneratedValue(generator = "idGenerator")    @GenericGenerator(name = "idGenerator", strategy = "uuid")private String id;        public IDEntity(){    }        public IDEntity(String id){    this.id = id;    }public String getId() {return id;}public void setId(String id) {this.id = id;}}



2. 之后如果有一个新的持久化对象,就可以继承这个类了例如

Student.java类

@Entity@Table(name="STUDENT")public class Student extends IDEntity {/** *  */private static final long serialVersionUID = 965916043460317019L;/** * 名称 */private String name="";public String getName() {return name;}public void setName(String name) {this.name = name;}}


3. 但是在实际中,表与表之间的关联关系或是从属关系也很常见

Student 表

    - ID

    - teacherID

    - name


Teacher 表

    - ID

    - name

下面来设计一个从属关系 学生和老师 多对一的关系

Teacher.java

@Entity@Table(name="TEACHER")public class Teacher extends IDEntity { /** *  */private static final long serialVersionUID = 5286263216193082850L;/** * 老师名称 */private String name="";@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)@JoinColumn(name="teacherID")private Set<Student> students = new HashSet<Student>();public String getName() {return name;}public void setName(String name) {this.name = name;}    public Set<Student> getStudents() {        return students;    }    public void setStudents(Set<Students> students) {        this.students = students;    }public Teacher(String name) {this.name = name;}public Teacher() {}}



而后学生表中有一个teacherID 域外键到老师表,是从属关系

Student.java

@Entity@Table(name="STUDENT")public class Student extends IDEntity {/** *  */private static final long serialVersionUID = 965916043460317019L;@ManyToOne(cascade=CascadeType.ALL)@JoinColumn(name="teacherID")private Teacher teacher = new Teacher();/** * 名称 */private String name="";public String getName() {return name;}public void setName(String name) {this.name = name;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}}

这里我们需要关注下

1) 级联问题 CascadeType

CascadeType类中有这样几个常量,

ALL 以下四个都有

PERSIST 级联新建

MERGE 调用session.merge()触发

REFRESH 调用session.refresh()触发 重新去session中取对象,如果没有就会报错

REMOVE 级联删除


2) FetchType

FetchType.LAZY懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载



原创粉丝点击