Java——POJO 总结

一:什么是 POJO
“Plain Old Java Object”“简单 java 对象”。POJO 的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的 java 对象。

二:为什么会有 POJO?
主要是 Java 的开发者被 EJB 的繁杂搞怕了,大家经过反思,又回归 “纯洁老式” 的 JavaBean,即有无参构造函数,每个字段都有 getter 和 setter 的 java 类。

三:POJO 的意义
POJO 让开发者可专注于业务逻辑和脱离框架的单元测试。除此之外, 由于 POJO 并不须要继承框架的类或实现其接口,开发者能够极其灵活地搭建继承结构和建造应用。
POJO 的意义就在于它的简单而灵活性,因为它的简单和灵活,使得 POJO 能够任意扩展,从而胜任多个场合,也就让一个模型贯穿多个层成为现实。
先写一个核心 POJO,然后实现业务逻辑接口和持久化接口,就成了 Domain Model; UI 需要使用时,就实现数据绑定接口,变成 VO(View Object)

四:POJO 与 PO、VO 的区别

PO 是指持久对象(persistant object 持久对象)。

VO 是指值对象或者 View 对象(Value Object、View Object)。View Object。

持久对象实际上必须对应数据库中的 entity(与数据库中的字段一致),实体类与数据库表中字段不一致时,可以通过如下方法解决:

1. 与数据库表对应的PO.class
@Transient
不是数据库表字段的属性必须加@Transient注解(import javax.persistence.Transient)

@Column
数据库表字段与result不一致时用@Column注解,例如:
@Column(name = "t_schema")
private String schema;

2. 传入参数与数据库表字段不一致:
@Param
举个例子
表字段f_schema与实体schema不一致 错误代码:
  public int update(UserExtraInfo info);
表字段f_schema与实体schema不一致 正确代码:
  public int update(@Param("info") UserExtraInfo info);

所以和 POJO 有所区别。比如说 POJO 是由 new 创建,由 GC 回收。但是持久对象是 insert 数据库创建,由数据库 delete 删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库 Connection 之中,Connnection 关闭以后,持久对象就不存在了,而 POJO 只要不被 GC 回收,总是存在的。

由于存在诸多差别,因此持久对象 PO(Persistent Object) 在代码上肯定和 POJO 不同,起码 PO 相对于 POJO 会增加一些用来管理数据库 entity 状态的属性和方法。而 ORM 追求的目标就是要 PO 在使用上尽量和 POJO 一致,对于程序员来说,他们可以把 PO 当做 POJO 来用,而感觉不到 PO 的存在。

五: 关于 PO 类(持久化类)

PO:Persistent Object 持久化对象。

持久化对象,在 Hibernate 经常会遇见这样的概念。Hibernate 实体状态有三种状态:瞬时态,持久态,游离态。

1)瞬时态(暂态):(Transient)实体在内存中自由存在,它与数据库记录无关。po 在 DB 中无记录(无副本),po 和 session 无关(手工管理同步)。

eg. Customer customer=New Customer();

customer.setName("eric"); 这里的 Customer 对象与数据库中的数据没有任何关联。

2)持久态 (Persistent): 实体对象处于 Hibernate 框架的管理之中。 po 在 DB 中有记录,po 和 session 有关(session 自动管理同步)。

3 ) 游离态(脱管态):(Detached)处于 Persistent 状态的实体对象,其对应的 session 实例关闭后,那么此时的实体对象处于 Detached 态。

po 在 DB 中有记录,po 和 session 无关(手工同步管理)

无名态:po 处于游离态时被垃圾站回收了(垃圾回收机制),没有正本,只有 DB 中的副本。

po 处于瞬时态时被垃圾站回收了,则死亡。(唯一可以死亡的状态)

代码如下: 需要 jar 包:ejb3-persistence.jar

package com.rcoginion.test;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

import org.springframework.data.annotation.Id;

@Entity
@Table(name = "USER")
public class ContractAttachPO  implements Serializable{

    /**
     * 序列号版本
     */
    private static final long serialVersionUID = 1393027357708703114L;
    
    // Fields
    
    /**
     * 合同id.
     */
    private Long userId;

    /**
     * 用户名.
     */
    private String userName;
    
    /**
     * 获取 .
     */
    @Id
    @GeneratedValue(generator = "S_USER_ID")
    @Column(name = "USER_ID", precision = 16, scale = 0)
    public Long getUserId() {
        return userId;
    }

    /**
     * 设置 .
     */
    public void setUserId(Long userId) {
        this.userId = userId;
    }

    /**
     * 获取 .
     */
    @Column(name = "USER_NAME")
    public String getUserName() {
        return userName;
    }

    /**
     * 设置 .
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }
}
注释说明:
 1.@Entity  //说明此java类是实体类 
 2.@org.hibernate.annotations.GenericGenerator(name = "S_USER_ID", strategy = "sequence",parameters
    = { @Parameter(name = "sequence", value = "S_USER_ID") }) 导入import org.hibernate.annotations.
    Parameter,是自动生成oracle序列的方法。调用创建好的序列:S_USER_ID来自动生成。
3.@Id //说明是主键(@Id此注解不能省略,不然Hibernate在调用po进行ORM操作的时候,会出现错误,千万不要
    认为主键不是自增,就不用指定主键了) @GeneratedValue(generator = "S_USER_ID")  //主键的生成方式
 4.@Table(name = "USER")           //指定数据库对应的表
 5.@Column(name = "USER_NAME")     //数据库字段和类属性对应关系 
   @Column注解配置项还有很多,具体可以了解javax.persistence的注解说明

写下你的评论...

纠正一下,POJO 不是 “Plain Old Java Object” ,而应该是 Ordinary