首页 > 编程语言 >[Java]POJO总结

[Java]POJO总结

时间:2023-09-20 19:34:14浏览次数:50  
标签:总结 Java 对象 数据库 POJO USER 持久 PO

一、什么是POJO

“Plain Old Java Object”“简单java对象”,也有另外一种英文描述“Plain Ordinary Java Object”,都不影响。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。

通常POJO类的规范:

  • 所有属性应该是私有的
  • 所有属性都应该有对应的Setter方法、Getter方法
  • 应该生成基于所有属性的hashCode()方法、equals()方法
    • 需要保证:如果2个对象的类型相同,且所有属性值相同,则hashCode()返回相同的结果,且equals()对比结果为true,否则,hashCode()返回不同的结果,且equals()对比结果为false
  • 应该实现Serializable接口
    • 可以不关心是否生成序列化版本ID

二、为什么会有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类是实体类 
 [email protected](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的注解说明
*/

标签:总结,Java,对象,数据库,POJO,USER,持久,PO
From: https://www.cnblogs.com/xizhunet/p/17718183.html

相关文章

  • 无涯教程-JavaScript - CHISQ.DIST.RT函数
    描述CHISQ.DIST.RT函数返回卡方分布的右尾概率。X2分布与X2测试相关。使用X2检验比较观察值和期望值。通过将观察到的输出与预期的输出进行比较,您可以决定原始假设是否有效。语法CHISQ.DIST.RT(x,deg_freedom)争论Argument描述Required/OptionalXThevalue......
  • Java框架中常用的几种成熟的token生成框架对比
    Java框架中常用的几种成熟的token生成框架对比Java框架中常用的几种成熟的token生成框架有:SpringSecurity:一个基于Spring的安全框架,提供了声明式的安全访问控制解决方案,支持多种认证和授权机制,如OAuth2.0、JWT等。ApacheShiro:一个轻量级的Java安全框架,提供了身份认证......
  • 日常编程奇葩又常规问题总结
    相信大家在日常编程中遇到过不少奇葩问题,第一反应就是不可能,怎么可能会出现这个问题呢?于是抓耳挠腮,带着充满疑惑的问题,四处寻找答案。其实遇到问题并不可怕,可怕的是我们缺少解决问题的信心,正所谓只要思想不滑坡,办法总比困难多。解决问题才是打工人的价值所在,也是个人价值展现......
  • Java学习之路--GUI编程06
    packagecom.gui.lesson06;importjavax.swing.*;importjava.awt.*;//2023.3.25/3.26GUI编程--下拉框学习(Combobox)//这个程序最终运行结果不美观,正常情况下下拉框我们放在一个面板里面再添加到容器中。这里就只是演示下拉框是什么样子publicclassTestComboboxDemo01extendsJ......
  • Java学习之路--GUI编程--贪吃蛇小游戏
    贪吃蛇小游戏界面实现四步走1.定义数据2.面板里将数据画上去3.监听事件键盘事件packagecom.gui.snake;importjavax.swing.*;importjava.net.URL;//2023.3.28GUI编程--贪吃蛇小游戏的实现--数据中心(只有一堆图片的数据)--贪吃蛇各个部分的导入--图片文件夹有两种导入......
  • 无涯教程-JavaScript - CHISQ.DIST函数
    描述CHISQ.DIST函数返回卡方分布。卡方分布通常用于研究样本中某物百分比的变化,如人们每天看电视的时间所占的比Example。语法CHISQ.DIST(x,deg_freedom,cumulative)争论Argument描述Required/OptionalXThevalueatwhichyouwanttoevaluatethedistribution.R......
  • Java学习之路--GUI编程03
    packagecom.gui.lesson03;importjava.awt.*;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;//2023.3.20GUI编程--键盘监听学习publicclassTestKeyListener{publicstaticvoidmain(String[]args){newKeyFrame();}}//键盘监听类cla......
  • Java学习之路--GUI编程04
    packagecom.gui.lesson04;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;//2023.3.21GUI编程--dialog(弹窗)学习publicclassDialogDemoextendsJFrame{publicDialogDemo(){this.setVisibl......
  • Java学习之路--GUI编程05
    packagecom.gui.lesson05;importjavax.swing.*;importjava.awt.*;importjava.net.URL;//2023.3.24GUI编程--Swing--JButton按钮学习publicclassJButtonDemo01extendsJFrame{publicJButtonDemo01(){Containercontainer=this.getContentPane();//Contain......
  • 《同构JavaScript应用开发》电子书PDF+源代码
    本书将向你展示如何构建和维护属于自己的同构JavaScript应用。全书分为三部分,第一部分描绘不同种类的同构JavaScript的轮廓,第二部分介绍关键概念,第三部分提供业界同行的解决方案案例。通过阅读本书,你将了解到这种应用架构日益流行的原因,并将其运用于解决关键的业务问题,如页面加载速......