第4.25课 上课 查询(加载)操作, 基础映射, 主键映射, 基本属性映射

4_25

查询(加载)操作

 根据主键查询单条记录

重点:get和load方法的区别:

 

get的方法(推荐):

-- get 根据主键id查询一条记录(立即查询)

  -- get方法返回的是一个持久化类的实例,立即执行就发起SQL语句查询id对应的记录

-- get方法查询id对应的记录不存在的时候 返回 null

----------------------------------------------------------------------------------------------

load的方法:

  -- load 根据主键id查询一条记录(延迟查询).

  -- load方法返回的是一个持久化类的代理对象,当真正访问除id以外的属性的时候才去发起SQL语句查询id对应的记录

当你真正用到该代理对象的属性时,有可能出现session关闭的异常,因为要去数据库表中查询,那Session就不能关闭,

因为Session封装了数据库连接.

  -- load方法查询id对应的记录不存在的时候报 ObjectNotFoundException 异常.

 

 

 

 

  get

get()方法:

-- 根据主键id查询一条记录(立即查询).

 

User user = (User)session.get(User.class, 1); // user : 持久化状态

System.out.println(user.getName() + "==" + user.getAge());

// 判断Session的一级缓存中是否包含这个对象,true: 持久化状态

System.out.println(session.contains(user));

  load

load()方法:

-- 根据主键id查询一条记录(延迟查询).

-- 延迟从数据库表查询数据,一开始返回代理对象,当你真正要用到它的属性时,才会生成查询语句到数据库表中查询数据。

当你要用到它的时候,要保证Session不能关闭。

 

 

User user = (User)session.load(User.class, 2); // user : 持久化状态

System.out.println(user.getName() + "==" + user.getAge());

// 判断Session的一级缓存中是否包含这个对象,true: 持久化状态

System.out.println(session.contains(user));

基础映射

 @Entity

@Entity注解:

-- 将普通的pojo转化成持久化类.

-- 该注解写在pojo类上.

 @Table(持久化类转化成表)

@Table: 把持久化类转化成表的相关信息。

-- name:指定表名。

-- indexes: 用于指定表的引索列.

-- uniqueConstraints:用于指定唯一约束。

 

indexes : @Index(columnList="数据表中的列名", name="索引名")

indexes={@Index(), @Index()}

indexes={@Index(columnList="name", name="IDX_NAME"),

@Index(columnList="address", name="IDX_ADDRESS")} // 创建表中的索引

 

 

uniqueConstraints : @UniqueConstraint(columnNames={"列名","列名"}, name="唯一约束名")

uniqueConstraints={

@UniqueConstraint(columnNames={"name", "age"}, name="UC_NAME_AGE")}) // 多列建联合唯一约束

 

  name(表名)

  indexes(索引)

  uniqueConstraints(唯一约束)

主键映射

 

 @Id

@Id() // 主键列

private Long id;

 

 

 

@Id() // 主键列

private String id;

 主键自增长策略

  @GeneratorValue(生成值)

主键生成策略:

@GeneratorValue(strategy=GenerationType.xxx)

-- GenerationType.IDENTITY: 适宜MySQL、SqlServer有自增长列的数据库。

-- GenerationType.SEQUENCE:适宜Oracle这种没有自增长有sequence的数据库。

-- GenerationType.AUTO:让Hibernate根据数据库方言自动选择主键生成策略。

-- GenerationType.TABLE: 适宜所有的数据库,因为它会单独生成一张表来维护主键生成。

   IDENTITY(自动增长生成策略)

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)

private Integer id;

   SEQUENCE(序列生成策略)

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)

private Integer id;

   TABLE(生成一张表维护主键策略)

@Id @GeneratedValue(strategy=GenerationType.TABLE)

private Integer id;

   AUTO(自动选择主键生成策略)

@Id @GeneratedValue(strategy=GenerationType.AUTO)

private Integer id;

基本属性映射

 @Column(属性转化成表中的列)

@Column : 持久化类中属性转化成数据库表中列的相关信息

-- name:指定列名。

-- length: 该列支持的长度。

-- precision:有效的总位数。(BigDecimal)

-- scale:小数点的位数。(BigDecimal)

-- unique: 唯一约束。

-- nullable:非空约束。

-- insertable:是否允许插入true:允许 false: 不允许。

-- updatable:是否允许修改true:允许 false: 不允许。

-- columnDefinition :指定列的定义。

  name(指定列名)

  length(该列支持的长度)

  precision(有效的总位数)

  scale(小数点的位数)

  unique(唯一约束)

  nullable(非空约束)

  insertable(是否允许插入)

  updatable(是否允许修改)

  columnDefinition(指定列的定义)

 @Temporal(日期属性)

  TemporalType.DATE(yyyy-MM-dd)

  TemporalType.TIME(HH:mm:ss)

  TemporalType.TIMESTAMP(yyyy-MM-dd HH:mm:ss) 默认

 @Transient(指定不是持久化属性)

@Transient:指定不是持久化属性

transient:关键字修饰不需要序列化的属性,同时用它也能指定不是持久化的属性。

posted on 2018-01-31 22:27  東風★破  阅读(138)  评论(0)    收藏  举报

导航