Hibernate注解备忘

CY 2018年06月08日 711次浏览

总结一下曾经用到过的Hibernate注解


实体类注解@Entity将该类标记为实体

name:可选,一般省略

使用@Entity时必须指定实体类的主键属性(@Id),如果不指定,会报异常:No identifier specified for entity:


实体类注解@Table指定实体类对应的表名。 如果不使用@Table注释,hibernate将默认使用类名作为表名称。

@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息

name:可选,映射表的名称,默认表名和实体名称一致,只有在不一致的情况下才需要指定表名

catalog:可选,表示Catalog名称

schema:可选,表示Schema名称(相当于数据库名(但这样又不会去创建一个新的数据库))(在创建表时,sql语句表名前会有数据库名的限定), mysql5.7支持catalog但是是不支持schema


实体类注解@Id标记属性为该实体的主键。

必须存在,定义了映射到数据库表的主键的属性,一个实体类可以有一个或者多个属性被映射到主键,可置于主键属性或者其getter


实体类注解@Column指定此属性或字段的列的详细信息。如果未指定@Column注释,则默认为属性名。


实体类注解@Embedded@Embeddable

用来将一个实体类的属性嵌入到另一个实体类中,两个实体类生成一张表

参考链接: https://blog.csdn.net/lmy86263/article/details/52108130


实体类注解@MappedSuperclass注解的作用是让该Entity作为父类映射,其他的Entity继承该父类,会在其他的Entity中添加该父类中的属性,而不会为该父类单独生成一张表。


实体类注解@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

实体类注解@DiscriminatorColumn

实体类注解@DiscriminatorValue

这三个注解配合使用,用来做继承映射,所谓继承映射就是父类抽出了几个实体类中相同的属性,子类各自有各自独特的属性,然后这几个子类可以公用一张表,只不过有一个字段来辨识这张表中的某个数据属于哪个子类,这种情况很多场景都能用的到。

@Inheritance中的strategy字段可以有下面的三种选择:

strategy=InheritanceType.SINGLE_TABLE 将父类和所有子类集合,存在一张表中,全部创建新的字段

strategy=InheritanceType.TABLE_PER_CLASS 每一个类创建一个表,这些表相互独立

strategy=InheritanceType.JOINED 将父类、子类分别存放在不同的表中,并且建立相应的外键,以确定相互之间的关系

@DiscriminatorColumn 只能用在@Inheritance(strategy=InheritanceType.SINGLE_TABLE)JOINED下,该注解的意义是在表中添加一个字段,这个字段专门用来标识子类,Hibernate会在自动用该字段对应实体类的类型。

@DiscriminatorValue

这个注解标识要用什么值来标识当前子类


Repository注解@Query

该注解可以写JPQL语句,也可以写SQL语句,如果要写SQL语句,需要设置属性 nativeQuerytrue


Repository注解@Modifying

这个注解用来标明JPQL或者SQL所作的操作是和修改数据相关的,如果增删改不加该注解,会报错。


实体类注解@OneToMany, @ManyToOne@ManyToMany@OneToOne

用来设置该类和对方类的关系,其中的 targetEntity 属性指定的是对方类的class

可以使用 @OneToMany(mappedBy = "customer") 的方式来放弃外键的维护,一般外键的维护交给一的一方就好了。


实体类注解@JoinColumn

加入外键引用, name 属性设置外键的名称referencedColumnName 属性设置的是参照的主表的主键的列名,主表一般是一的一方,所以这里填写一的一方表的主键字段名就可以了。


实体类注解@GeneratedValue

这个里面的strategy属性有以下四种:

  • TABLE:使用一个特定的数据库表格来保存主键。
  • SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列(比如说Oracle)。
  • IDENTITY:主键由数据库自动生成(主要是自动增长型, MySQLAUTO_INCREMENT
  • AUTO:主键由程序控制。

实体类注解@JoinTable

可以用在多对多上面,将两个实体类与中间表建立起关系

name 属性为中间表的名字

joinColumns 该实体类在中间表中的列名,和引用的主键名

inverseJoinColumns 对方实体类在中间表中的列名,和引用的主键名


实体类注解@Transient

可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就务必将其表示标志为@Transient,否则ORM框架默认其注解为@Basic


实体类注解@Version

定义乐观锁

参考链接: https://www.cnblogs.com/wangzhongqiu/p/7550985.html


实体类注解@Temporal

用于定义映射到数据库的时间精度

@Temporal(TemporalType=DATE) 日期

@Temporal(TemporalType=TIME) 时间

@Temporal(TemporalType=TIMESTAMP) 两者兼具


补充...