hibernate注解简单使用

来源:互联网 发布:ios屏幕检测软件 编辑:程序博客网 时间:2024/06/06 20:08

最近刚学的hibernate,用来写东西,出现挺多问题的,下面说的都是比较简单实用的。

前提:

这篇对hibernate的注解的一些参数的介绍的不是很不全(通常只是介绍例子中给出的注解解析),要更完整的了解其中一个注解可以再继续查询这个注解。
这篇更多的是我自己学hibernate的总结,然后把注解列举一下,方便查找。

映射实体类例子

一般文件类DefaultFile

@MappedSuperclass@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)public class DefaultFile{    // Fields    @Id    @Column(name = "id", insertable = false, updatable = false)    @GeneratedValue(strategy=GenerationType.IDENTITY)    private int id;    @Column(name = "name")    private String name;    @Column(name = "path")    private String path;    @Column(name = "note")    private String note;    @Column(name = "uploadDate", insertable = false, updatable = false)    private Timestamp uploadDate;    /**     * 文件内容,不被映射成column     */    @Transient    File file;    ...}

图片文件类ImageFile

@Entity@Table(name = "imageFile")public class ImageFile extends DefaultFile{    @OneToMany(cascade = CascadeType.ALL,mappedBy="imagefile",fetch = FetchType.LAZY)    private Set<Account> accounts = new HashSet<Account>();    ...}

账户类Account

@Entity@Table(name="account")public class Account  {    // Fields    @Id    @Column(insertable=false,updatable=false)    @GeneratedValue(strategy=GenerationType.IDENTITY)    private Integer id;    @ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)    @JoinColumn(name="imageID")    //头像    private ImageFile imagefile;    @Column    private String name;    @Column    private String password;    @Column(insertable=false,updatable=false)    private Timestamp createdDate;    ...}

@Entity

作用:

标记为实体类,标记后都会被映射到数据表中

用法:

一般实体类都要加上这个注释

@MappedSuperclass

作用:

表明该类作为父类被其他实体类继承后,其它实体类可以继承该类的属性,并且结合各子类各自映射对应的表,然后改父类不映射到数据库表

用法:

这个和上面的@Entity可以说二者只能选其一,如果选择@MappedSuperclass则不映射表,如果用@Entity则会映射到表

结合例子:

例子中DefaultFile被注解为@MappedSuperclass,因此DefaultFile不会被映射到表,而ImageFile继承DefaultFile,因此ImageFile会继承DefaultFile的属性,加上自己的属性,映射到新表

@Inheritance

作用:

定义继承的策略

用法:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
上面的InheritanceType.TABLE_PER_CLASS是指每个子类都成为一个新表,还有以下的继承策略(看名字就大概知道意思了):
inheritance

@Table

作用:

用来标记该实体类映射到数据库中的表的表名

用法:

可添加参数来说明表名@Table(name=”table_name”)

@Id

作用:

说明该属性为主键

@GeneratedValue

作用:

表明该列为自动增长的属性

用法:

@GeneratedValue(strategy=GenerationType.IDENTITY)
其中strategy指自动增长的策略,而这个GenerationType.IDENTITY是指数据库自动增长,相当于mysql中auto_increment,还有其它属性:
generatedvalue

@Column

作用:

指明该列的属性

用法:

@Column(name = “uploadDate”, insertable = false, updatable = false)

name = “column_name”

指明列名

insertable=false

插入操作时忽略该属性

updatable=false

更新 操作时忽略该属性

@OneToMany

作用:

表名一对多的关系,通常用于Set<T>变量

用法:

@OneToMany(cascade = CascadeType.ALL = CascadeType.ALL,mappedBy=”imagefile”,fetch = FetchType.LAZY)

cascade

cascade

CascadeType.ALL

所有操作都进行关联,具体看下面例子:

    @Entity    public class A{        @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)        @JoinColumn(name = "bID")        private B b;            ...    }    @Entity    public class B{        ...    }    B b = new B();    A a = new A();    a.setB(b);    //这时数据库中的b表是没有b对象的信息的,但是在执行完下面a对象的保存后,也会把对象b也保存到b表中。    aDao.save(a);

CascadeType.MERGE

例子:

    @Entity    public class A{        @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)        @JoinColumn(name = "bID")        private B b;            ...    }    @Entity    public class B{        ...    }    B b = new B();    A a = new A();    a.setB(b);    //这时数据库中的b表是没有b对象的信息的,这时执行下面的保存a对象的时候就会报错,只有b对象信息在数据库b表中有对应的,下面语句才可以正常执行    aDao.save(a);

mappedBy=”imagefile”

如果这个一对多的关系不是通过第三张表来维持,而是多方保存一方的id(多方外键引用一方),则必须要有mappedBy来指明多方中哪个变量来保存一方(外键),值是多方里面保存一方的属性名字,具体可看例子中的使用

fetch=FetchType.EAGER

加载的策略,有积极和懒惰,积极是指用查询语句获取对象时,马上加载标记为@OneToMany的变量,懒惰则是等到使用时才获取。

@ManyToOne

作用:

表名一对多的关系,通常用在对应的一方类的一个变量

用法:

@ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
属性和@OneToMany的基本差不多。但是如果这个多对一的关系不是通过第三张表来维持,而是保存在多方的表中(外键),必须还添加一个注解@joinColumn

@joinColumn

作用:

作用于@ManyToOne标注后的变量,指明该变量映射到数据库中表的列名

用法:

@JoinColumn(name=”imageID”)
值是数据库中外键的表名

@Transient

作用:

指明被标注的变量不需要被映射到数据库表中

0 0