Hibernate映射(一)

PO=POJO+注解

修饰PO类

被@Entity修饰的持久化类的所有属性都会被映射到底层数据表
@Entity:可指定一个name属性(为该实体类的名称)
@Table:指定持久化类所映射的表,属性:
name:设置持久化类所映射表的表名。无指定,则和持久化类名相同
@UniqueConstraint:用于为数据表定义唯一约束,属性:
columnNames:一个字符串数组,每个字符串元素代表一个数据列
@Index:为数据表定义索引
@Proxy:注解的proxyClass属性指定一个接口,在延迟加载时作为代理使用
@DynamicInsert:指定用于插入记录的insert语句是否在运行时动态生成
@DynamicUpdate:指定用于更新记录的update语句是否在运行时动态生成
@SelectBeforeUpdate:在更新某个持久化对象之前是否需要进行一次查询
@Where:clause属性可指定一个附加的SQL语句过滤条件(类似于添加Where语句)

映射属性

@Column:指定数据列的详细信息(列名、列字段长度等)

length
name:该列列名。默认与修饰的成员变量名相同
nullable:指定该列是否允许为null。默认:true
table:指定该列所属的表名。当需要用多个表保存一个实体,需要指定该属性

@Access:用于单独改变Hibernate对该属性的访问策略

@Formula(公式、准则):value属性可指定一个SQL表达式,指定该属性的值将根据表达式来计算,该属性值是动态计算出来的,无需保存到数据库
@Formula("(select concat(nt.title,nt.content) from news_inf nt where nt.id=id)")

@Generated:设置该属性映射的数据列的值是否由数据库生成,
value属性:
GenerationTime.NEVER、(不由数据库生成)
GenerationTime.INSERT(在执行insert语句时执行)、
GenerationTime.ALWAYS(insert和update都会被重新生成)

@Transient(短暂的,临时的)修饰不想持久保存的属性,不会被映射到数据列中

@Enumerated修饰枚举属性
value属性:EnumType.STRING时,底层数据库保存枚举值的名称
EnumType.ORDINAL时,底层数据库保存枚举值的序号

@Lob、@Basic修饰大数据类型属性
@Basic属性:
fetch:指定是否延迟加载该属性。FetchType.EAGER(立即加载)、FetchType.LAZY(延迟加载)
optional:指定该属性映射的数据列是否允许使用null值

@Temporal(时间的)修饰日期类型的属性
属性:
TemporalType.DATE、TemporalType.TIME、TemporalType.TIMESTAMP

映射主键

Hibernate建议持久化类定义一个标识属性,用于唯一地标识某个持久化实例,而标识属性则需要映射到底层数据表的主键
数据库建模理论推荐使用逻辑主键,逻辑主键没有实际意义,仅仅用来标识一行记录,Hibernate提供了主键生成器,它负责为每个持久化实例生成唯一的逻辑主键值

注解修饰

1、@Id注解无需指定任何属性:标识属性为基本数据类型、包装类、String、Date等

2、@GeneratedValue修饰实体的标识属性:逻辑主键自动生成主键值

strategy:指定Hibernate对该主键列使用怎样的主键生成策略:

GenerationType.AUTO(默认值)、
GenerationType.IDENTITY(MySQL,SQL Server)、
Generation.SEQUENCE(Oracle)、
GenerationType.Table(使用辅助表来生成主键,与@TableGenerator一起使用)

generator:该属性引用@SequenceGenerator、@TableGenerator所定义的生成器的名称

使用SEQUENCE、TABLE主键生成策略,还需结合@SequenceGenerator、@TableGenerator
@TableGenerator支持的属性:

name:主键生成器名称
table:辅助表的表名
pkColumnName:指定存放主键名的列名
pkColumnValue:指定主键名
valueColumnName:指定存放主键值的列名
···

例:

import javax.persistence.*;

@Entity
@Table(name="news7_inf")
public class News {
    @Id
    @TableGenerator(name="newsGen", table="NEWS_ID_GEN",//表名
    pkColumnName="gen_key",valueColumnName="gen_value",//主键名、值的列名
    pkColumnValue="news_id")
    @GeneratedValue(strategy=GenerationType.TABLE,generator="newsGen")
    private Integer id;

    @Column(name="news_title",length=50)
    private String title;
    public void setTitle(String title){
        this.title=title;
    }
    public String getTitle(){
        return title;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值