pojo java_Java——POJO总结
一:什么是POJO
“Plain Old Java Object”“簡單java對象”。POJO的內(nèi)在含義是指那些沒有從任何類繼承、也沒有實(shí)現(xiàn)任何接口,更沒有被其它框架侵入的java對象。
二:為什么會有POJO?
主要是Java的開發(fā)者被EJB的繁雜搞怕了,大家經(jīng)過反思,又回歸“純潔老式”的JavaBean,即有無參構(gòu)造函數(shù),每個字段都有g(shù)etter和setter的java類。
三:POJO的意義
POJO讓開發(fā)者可專注于業(yè)務(wù)邏輯和脫離框架的單元測試。除此之外, 由于POJO并不須要繼承框架的類或?qū)崿F(xiàn)其接口,開發(fā)者能夠極其靈活地搭建繼承結(jié)構(gòu)和建造應(yīng)用。
POJO的意義就在于它的簡單而靈活性,因為它的簡單和靈活,使得POJO能夠任意擴(kuò)展,從而勝任多個場合,也就讓一個模型貫穿多個層成為現(xiàn)實(shí)。
先寫一個核心POJO,然后實(shí)現(xiàn)業(yè)務(wù)邏輯接口和持久化接口,就成了Domain Model; UI需要使用時,就實(shí)現(xiàn)數(shù)據(jù)綁定接口,變成VO(View Object)
四:POJO與PO、VO的區(qū)別
PO是指持久對象(persistant object持久對象)。
VO是指值對象或者View對象(Value Object、View Object)。View Object。
持久對象實(shí)際上必須對應(yīng)數(shù)據(jù)庫中的entity(與數(shù)據(jù)庫中的字段一致),實(shí)體類與數(shù)據(jù)庫表中字段不一致時,可以通過如下方法解決:
1. 與數(shù)據(jù)庫表對應(yīng)的PO.class
@Transient
不是數(shù)據(jù)庫表字段的屬性必須加@Transient注解?(import javax.persistence.Transient)
@Column
數(shù)據(jù)庫表字段與result不一致時用@Column注解,例如:
@Column(name = "t_schema")
private String schema;
2. 傳入?yún)?shù)與數(shù)據(jù)庫表字段不一致:
@Param
舉個例子
表字段f_schema與實(shí)體schema不一致 錯誤代碼:
public int update(UserExtraInfo info);
表字段f_schema與實(shí)體schema不一致 正確代碼:
public int update(@Param("info") UserExtraInfo info);
所以和POJO有所區(qū)別。比如說POJO是由new創(chuàng)建,由GC回收。但是持久對象是insert數(shù)據(jù)庫創(chuàng)建,由數(shù)據(jù)庫delete刪除的?;旧铣志脤ο笊芷诤蛿?shù)據(jù)庫密切相關(guān)。另外持久對象往往只能存在一個數(shù)據(jù)庫Connection之中,Connnection關(guān)閉以后,持久對象就不存在了,而POJO只要不被GC回收,總是存在的。
由于存在諸多差別,因此持久對象PO(Persistent Object)在代碼上肯定和POJO不同,起碼PO相對于POJO會增加一些用來管理數(shù)據(jù)庫entity狀態(tài)的屬性和方法。而ORM追求的目標(biāo)就是要PO在使用上盡量和POJO一致,對于程序員來說,他們可以把PO當(dāng)做POJO來用,而感覺不到PO的存在。
五: 關(guān)于PO類(持久化類)
PO:Persistent Object 持久化對象。
持久化對象,在Hibernate經(jīng)常會遇見這樣的概念。Hibernate實(shí)體狀態(tài)有三種狀態(tài):瞬時態(tài),持久態(tài),游離態(tài)。
1)瞬時態(tài)(暫態(tài)):(Transient)實(shí)體在內(nèi)存中自由存在,它與數(shù)據(jù)庫記錄無關(guān)。po在DB中無記錄(無副本),po和session無關(guān)(手工管理同步)。
eg. Customer customer=New Customer();
customer.setName("eric");這里的Customer對象與數(shù)據(jù)庫中的數(shù)據(jù)沒有任何關(guān)聯(lián)。
2)持久態(tài)(Persistent):實(shí)體對象處于Hibernate框架的管理之中。 po在DB中有記錄,po和session有關(guān)(session自動管理同步)。
3 ) 游離態(tài)(脫管態(tài)):(Detached)處于Persistent狀態(tài)的實(shí)體對象,其對應(yīng)的session實(shí)例關(guān)閉后,那么此時的實(shí)體對象處于Detached態(tài)。
po在DB中有記錄,po和session無關(guān)(手工同步管理)
無名態(tài):po處于游離態(tài)時被垃圾站回收了(垃圾回收機(jī)制),沒有正本,只有DB中的副本。
po處于瞬時態(tài)時被垃圾站回收了,則死亡。(唯一可以死亡的狀態(tài))
代碼如下: 需要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;
}
/**
* 設(shè)置 .
*/
public void setUserId(Long userId) {
this.userId = userId;
}
/**
* 獲取 .
*/
@Column(name = "USER_NAME")
public String getUserName() {
return userName;
}
/**
* 設(shè)置 .
*/
public void setUserName(String userName) {
this.userName = userName;
}
}
注釋說明:
1.@Entity //說明此java類是實(shí)體類
2.@org.hibernate.annotations.GenericGenerator(name = "S_USER_ID", strategy = "sequence",parameters
= { @Parameter(name = "sequence", value = "S_USER_ID") }) 導(dǎo)入import org.hibernate.annotations.
Parameter,是自動生成oracle序列的方法。調(diào)用創(chuàng)建好的序列:S_USER_ID來自動生成。
3.@Id //說明是主鍵(@Id此注解不能省略,不然Hibernate在調(diào)用po進(jìn)行ORM操作的時候,會出現(xiàn)錯誤,千萬不要
認(rèn)為主鍵不是自增,就不用指定主鍵了) @GeneratedValue(generator = "S_USER_ID") //主鍵的生成方式
4.@Table(name = "USER") //指定數(shù)據(jù)庫對應(yīng)的表
5.@Column(name = "USER_NAME") //數(shù)據(jù)庫字段和類屬性對應(yīng)關(guān)系
@Column注解配置項還有很多,具體可以了解javax.persistence的注解說明
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的pojo java_Java——POJO总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无需ROOT卸载或禁用vivo Z5手机
- 下一篇: 思路初探:采用c#实现pdf转ofd