hibernate注解说明文档
- 格式:pdf
- 大小:150.98 KB
- 文档页数:9
Hibernate注解中CascadeType用法汇总在Hibernate中,CascadeType注解用来配置实体之间的级联操作。
级联操作是指在对一个实体进行持久化、更新、删除等操作时,同时也对关联的其他实体进行相应的操作。
CascadeType注解常用于一对一、一对多、多对多等关联关系中。
CascadeType注解的常用取值有以下几种:1. CascadeType.ALL:表示所有的级联操作,包括持久化、更新、删除等。
2. CascadeType.PERSIST:表示级联持久化操作,即当实体被持久化时,关联的其他实体也会被持久化。
3. CascadeType.MERGE:表示级联更新操作,即当实体被更新时,关联的其他实体也会被更新。
4. CascadeType.REMOVE:表示级联删除操作,即当实体被删除时,关联的其他实体也会被删除。
5. CascadeType.REFRESH:表示级联刷新操作,即当实体被刷新时,关联的其他实体也会被刷新。
6. CascadeType.DETACH:表示级联脱管操作,即当实体脱管时,关联的其他实体也会被脱管。
7. CascadeType.ALL_DELETE_ORPHAN:表示级联删除操作,并且会删除所有孤儿实体。
下面是对CascadeType注解的使用方法进行汇总:1.一对一关联关系:```private Address address;```上述代码表示当保存、更新或删除一个实体对象时,操作对应的address实体也会被保存、更新或删除。
2.一对多关联关系:```private List<Order> orders;```上述代码表示当保存、更新或删除一个用户对象时,操作对应的所有订单对象也会被保存、更新或删除。
3.多对多关联关系:```private List<Role> roles;```上述代码表示当保存、更新或删除一个用户对象时,操作对应的所有角色对象也会被保存、更新或删除。
hibernate-validator常用注解Hibernate-Validator 是一个用来验证 bean 属性的开源框架,它通过使用 Java 语言编写的注释来校验 bean 属性的值是否有效,也可以用于开发高质量 Java 应用程序。
Hibernate-Validator 提供了大量的注解,可以在简单的方式对 bean 属性值进行校验,以确保属性值的有效性。
1. @NotNull:该注解用于校验 bean 属性值不能为 null,null 时会抛出 ConstraintViolationException 异常;2. @Null:该注解用于校验 bean 属性值必须为 null,不为null 时会抛出 ConstraintViolationException 异常;3. @AssertTrue:该注解用于校验 bean 属性值必须为 true,为false 时会抛出 ConstraintViolationException 异常;4. @AssertFalse:该注解用于校验 bean 属性值必须为 false,为 true 时会抛出 ConstraintViolationException 异常;5. @Min:该注解用于校验 bean 属性的数值必须大于等于@Min 指定的值,小于指定值时会抛出 ConstraintViolationException 异常;6. @Max:该注解用于校验 bean 属性的数值必须小于等于@Max 指定的值,大于指定值时会抛出 ConstraintViolationException 异常;7. @DecimalMin:该注解用于校验 bean 属性的数值必须大于等于@DecimalMin 指定的值,小于指定值时会抛出ConstraintViolationException 异常;8. @DecimalMax:该注解用于校验 bean 属性的数值必须小于等于@DecimalMax 指定的值,大于指定值时会抛出ConstraintViolationException 异常;9. @Size:该注解用于校验 bean 属性值的长度,当属性值的长度不符合@Size 指定的范围时会抛出 ConstraintViolationException 异常;10. @Digits:该注解用于校验 bean 属性值的数字格式,不符合数字格式时会抛出 ConstraintViolationException 异常;11. @Past:该注解用于校验 bean 属性值是一个过去的日期,不是过去的日期时会抛出 ConstraintViolationException 异常;12. @Future:该注解用于校验 bean 属性值是一个未来的日期,不是未来的日期时会抛出 ConstraintViolationException 异常;13. @Pattern:该注解用于校验 bean 属性值是否符合指定的正则表达式,不符合时会抛出 ConstraintViolationException 异常;14. @Email:该注解用于校验 bean 属性值是否为邮件地址,不是邮件地址时会抛出 ConstraintViolationException 异常;15. @Length:该注解用于校验 bean 属性值的长度,不符合长度范围会抛出 ConstraintViolationException 异常;16. @NotBlank:该注解用于校验 bean 属性字符串不能为 null 和空字符串,null 或空字符串时会抛出ConstraintViolationException 异常;17. @NotEmpty:该注解用于校验 bean 属性值不能为 null 或者为空集合,null 或空集合时会抛出 ConstraintViolationException 异常;18. @Range:该注解用于校验 bean 属性的数值或字符串的长度在指定的范围内,不在指定范围时会抛出ConstraintViolationException 异常;19. @CreditCardNumber:该注解用于校验 bean 属性值是否为信用卡号,不是信用卡号时会抛出 ConstraintViolationException 异常;20. @ScriptAssert:该注解用于校验 bean 属性值是否满足一个脚本表达式,不满足时会抛出 ConstraintViolationException 异常。
第一篇:官方文档的处理方法,摘自官方在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持。
1.使用SQLQueryhibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的.1Session.createSQLQuery();1.1标量查询最基本的SQL查询就是获得一个标量(数值)的列表。
1sess.createSQLQuery("SELECT * FROM CATS").list();2sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();将返回一个Object数组(Object[])组成的List,数组每个元素都是CATS表的一个字段值。
Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。
如果要避免过多的使用ResultSetMetadata,或者只是为了更加明确的指名返回值,可以使用addScalar()。
1sess.createSQLQuery("SELECT * FROM CATS")2 .addScalar("ID", Hibernate.LONG)3 .addScalar("NAME", Hibernate.STRING)4 .addScalar("BIRTHDATE", Hibernate.DATE)这个查询指定了:SQL查询字符串,要返回的字段和类型.它仍然会返回Object数组,但是此时不再使用ResultSetMetdata,而是明确的将ID,NAME和BIRTHDATE 按照Long, String和Short类型从resultset中取出。
同时,也指明了就算query 是使用*来查询的,可能获得超过列出的这三个字段,也仅仅会返回这三个字段。
hibernate saveorupdate举例使用Hibernate是一个用于Java语言的对象关系映射框架,它提供了一种将对象模型与关系数据库进行映射的方式,使开发人员可以通过面向对象的方式进行数据库操作。
其中,saveOrUpdate()是Hibernate中一个常用的方法,用于保存或更新实体对象。
在本文中,我将详细介绍saveOrUpdate()方法的使用,并以示例代码来演示其具体的操作步骤。
首先,我们需要配置Hibernate的相关环境和依赖。
在项目的pom.xml 文件中,添加如下的Hibernate依赖:xml<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.0.Final</version></dependency>同时,我们需要在项目中配置Hibernate的相关配置文件,如hibernate.cfg.xml。
在该文件中,我们需要配置数据库的连接信息、实体类与数据库表的映射关系等。
接下来,我们创建一个实体类,假设为User,用于映射到数据库中的一张用户表。
javaEntityTable(name = "user")public class User {IdGeneratedValue(strategy = GenerationType.IDENTITY)private Long id;Columnprivate String username;Columnprivate String password;getters and setters}在上述代码中,我们使用Entity注解将User类与数据库表进行映射,并使用Table注解指定了数据库表的名称。
Hibernate注解常用的hibernate annotation标签如下:@Entity--注释声明该类为持久类。
@Table(name="promotion_info")--持久性映射的表(表名="promotion_info)。
@Column(name=”DESC”,nullable=false,length=512)--用于指定持久属性或字段的映射列。
@Id--注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。
@GeneratedValue--定义自动增长的主键的生成策略。
@Transient--将忽略这些字段和属性,不用持久化到数据库。
@Temporal(TemporalType.TIMESTAMP)--声明时间格式。
@Enumerated--声明枚举@Version--声明添加对乐观锁定的支持@OneToOne--可以建立实体bean之间的一对一的关联@OneToMany--可以建立实体bean之间的一对多的关联@ManyToOne--可以建立实体bean之间的多对一的关联@ManyToMany--可以建立实体bean之间的多对多的关联@Formula--一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)@OrderBy--Many端某个字段排序(List)下面是对以上常用Hibernate注解标签的详细介绍与举例:@Entity--注释声明该类为持久类。
将一个Javabean类声明为一个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解.@Table(name="promotion_info")--持久性映射的表(表名="promotion_info).@T able是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名.示例:@Entity@T able(name="CUST", schema="RECORDS")public class Customer { ... }@Column(name=”DESC”,nullable=false,length=512)--用于指定持久属性或字段的映射列。
creationtimestamp注解CreationTimestamp注解是Hibernate框架中的一个注解,它用于指定实体类中的时间戳字段。
该注解可以自动将当前时间戳赋值给指定的字段,从而方便地记录实体类的创建时间。
使用CreationTimestamp注解的步骤如下:1. 在实体类中定义一个时间戳字段,例如:```@Column(name = "create_time")@CreationTimestampprivate Timestamp createTime;```2. 在该字段上添加CreationTimestamp注解,指定该字段为时间戳字段。
3. 在Hibernate配置文件中启用自动更新时间戳功能,例如:```<property name="hibernate.ejb.interceptor"value="org.hibernate.interceptor.EntityInterceptor" />```4. 在保存实体类时,Hibernate会自动将当前时间戳赋值给createTime字段。
使用CreationTimestamp注解可以方便地记录实体类的创建时间,避免手动设置时间戳的麻烦。
同时,该注解还可以与其他注解一起使用,例如@Temporal注解,指定时间戳字段的数据类型。
需要注意的是,CreationTimestamp注解只能用于实体类中的时间戳字段,不能用于其他类型的字段。
此外,该注解只能在Hibernate框架中使用,不能在其他ORM框架中使用。
总之,CreationTimestamp注解是Hibernate框架中非常实用的一个注解,可以方便地记录实体类的创建时间,提高开发效率。
在实际开发中,我们可以根据需要灵活使用该注解,从而更好地完成项目开发任务。
1.show_sql和format_sql
在hibernate.cfg.xml配置文件中添加如下的配置:
<property name="format_sq">true</property>,将sql语句格式化一下
2.类名与数据库表名不一致
在类名上方添加注解:@Table(name="XXX")
3.字段名和属性名不一致
在对应字段的getXXX方法上面上方添加注解:@Column(name="XXX")
4.取消字段的持久化
在对应字段的getXXX方法上面上方添加注解:@Transient
5.指定Date存储的格式:
在时间对应的getXXX方法上面添加注解:
@Temporal(TemporalType.TIME)只存储时间: hh:mm:ss
@Temporal(TemporalType.DATE)只存储日期: yyyy-MM-dd
@Temporal(TemporalType.DATETIME) 时间日期一起存储:yyyy-MM-dd hh:mm:ss
6.ID生成策略:
∙Id的get方法上方添加@GeneratedValue ,mysql默认是auto_increment,Oracle中默认是hibernate_sequence(名称固定)
∙联合主键:如图:
★:在主键类属性的get方法上方添加@EmbeddedId,设定联合主键!在主键类中写联合属性的get和set方法!
★:这个主键类必须重写public boolean equals()和public int hashCode()方法!实现Serializable接口。
* hibernate注释说明:* @Entity——将一个类声明为一个实体bean(即一个持久化POJO 类)* @Id——注解声明了该实体bean的标识属性(对应表中的主键)。
* @Table——注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字* @Column——注解声明了属性到列的映射。
该注解有如下的属性* name 可选,列名(默认值是属性名)* unique 可选,是否在该列上设置唯一约束(默认值false)* nullable 可选,是否设置该列的值可以为空(默认值false)* insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)* updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)* columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)* table 可选,定义对应的表(默认为主表)* length 可选,列长度(默认值255)* precision 可选,列十进制精度(decimal precision)(默认值0)* scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)* @GeneratedValue——注解声明了主键的生成策略。
该注解有如下属性* strategy 指定生成的策略(JPA定义的),这是一个GenerationType。
默认是GenerationType. AUTO* GenerationType.AUTO 主键由程序控制* GenerationType.TABLE 使用一个特定的数据库表格来保存主键* GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)* GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。
(这个值要与generator一起使用)* generator 指定生成主键使用的生成器(可能是orcale中的序列)。
* @SequenceGenerator——注解声明了一个数据库序列。
该注解有如下属性* name 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中* sequenceName 表示生成策略用到的数据库序列名称。
* initialValue 表示主键初始值,默认为0.* allocationSize 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50.* @GenericGenerator——注解声明了一个hibernate的主键生成策略。
支持十三种策略。
该注解有如下属性* name 指定生成器名称* strategy 指定具体生成器的类名(指定生成策略)。
* parameters 得到strategy指定的具体生成器所用到的参数。
* 其十三种策略(strategy属性的值)如下:* 1.native 对于orcale采用Sequence方式,对于MySQL和SQL Server采用identity(处境主键生成机制),* native就是将主键的生成工作将由数据库完成,hibernate不管(很常用)* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenera tor", strategy = "native")* 2.uuid 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。
占用空间大(字符串类型)。
* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenera tor", strategy = "uuid")* 3.hilo 要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用)* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGen erator", strategy = "hilo")* 4.assigned 在插入数据的时候主键由程序处理(很常用),这是<generator>元素没有指定时的默认生成策略。
等同于JPA中的AUTO。
* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenera tor", strategy = "assigned")* 5.identity 使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL 和SQL Server中很常用)。
等同于JPA中的IDENTITY* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenera tor", strategy = "identity")* 6.select 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenera tor", strategy = "select")* 7.sequence 调用谨慎数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。
* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenerator", strat egy = "sequence",* parameters = { @Parameter(name = "sequence", value= "seq_payablemoney") })* 8.seqhilo 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence的数据库,如Orcale(比较少用)* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenerator", strat egy = "seqhilo",* parameters = { @Parameter(name = "max_lo", value = "5") })* 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。
* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenera tor", strategy = "increnment")* 10.foreign 使用另一个相关的对象的主键。
通常和<one-to-one>联合起来使用。
* 例:@Id* @GeneratedValue(generator = "idGenerator")* @GenericGenerator(name = "idGenerator", strategy = " foreign",* parameters = { @Parameter(name = "property ", value = "info") })* Integer id;* @OneToOne* EmployeeInfo info;* 11.guid 采用数据库底层的guid算法机制,对应MySQL的uuid()函数,SQL Server的newid()函数,ORCALE的rawtohex(sys_guid())函数等* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenerator", strat egy = "guid")* 12.uuid.hex 看uudi,建议用uuid替换* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenerator", strat egy = "uuid.hex")* 13.sequence-identity sequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本* 例:@GeneratedValue(generator = "paymentableGenerator")* @GenericGenerator(name = "paymentableGenerator", strat egy = "sequence-identity",* parameters = { @Parameter(name = "sequence ", value = "seq_payablemoney") })** @OneToOne设置一对一个关联。