JPA对象的持久化
JPA(Java Persistence API)是Java的持久化API,用于對象的持久化。它是一個強大的ORM持久化的解決方案,免去了使用JDBCTemplate開發的編寫腳本工作。JPA通過簡單約定好接口方法的規則自動生成相應的JPQL語句,然后映射成POJO對象。
JPA是一個規范化接口,封裝了Hibernate的操作作為默認實現,讓用戶不通過任何配置即可完成數據庫的操作。
JPA創建實體和JDBC Template創建實體的區別:
通過JPA創建實體
通過JDBC Template 創建實體
@Data public class User implements RowMapper<User> {private int id;private String username;private String password;//必須重寫mapRow方法@Overridepublic User mapRow(ResultSet resultSet,int i) throws SQLException{User user=new User();user.setId(resultSet.getInt("id"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));return user;} }對比JPA和JDBC Template創建實體的方式可以看出:JPA的實現方式簡單明了,不需要重寫映射(支持自定義映射),只需要設置好屬性即可。id的自增由數據庫自動管理,也可以由程序管理,其他的工作JPA自動處理好了。
了解JPA注解和屬性
JPA常用注解
| @Entity | 聲明類為實體 |
| @Table | 聲明表名,@Entity和@Table注解一般一起使用,如果表名和實體類名相同,那么@Table可以省略 |
| @Basic | 指定非約束明確的各個字段 |
| @Embedded | |
| @Id | 指定的類的屬性,一個表中的主鍵 |
| @GeneratedValue | 指定如何標識屬性可以被初始化 |
| @Transient | 表明該屬性并非一個數據庫表的字段的映射,ORM框架將忽略該屬性。如果一個屬性并非數據庫表的字段映射,就務必將其標示為@Transient,即它不是持久的,為虛擬字段 |
| @Column | 指定持久屬性,即字段名。如果字段名和列名相同,則可以省略。 |
| @SequenceGenerator | |
| @TableGenerator | 在數據庫生成一張表來管理主鍵生成策略 |
| @AccessType | 用于設置訪問類型。如果設置@AccessType(FIELD),則可以直接訪問變量,并且不需要使用Getter和Setter方法,但必須為public屬性。如果設置@AccessType(PROPERTY),則通過Getter和Setter方法訪問Entity的變量 |
| @UniqueConstraint | 指定的字段和用于主要或輔助表的唯一約束 |
| @ColumnResult | 可以參考使用select子句的sql查詢中的列名 |
| @NamedQueries | 指定命名查詢的列表 |
| @NamedQuery | 指定使用靜態名稱的查詢 |
| @Basic | 指定實體屬性的加載方式,如@Basic(fetch=FetchType.LAZY) |
| @JsonIgnore | 作用是JSON序列化時將Java Bean中的一些屬性忽略掉,序列化和反序列化都受影響 |
2.映射關系注解
| @JoinColumn | 指定一個實體組織或實體集合。用在多對一和一對多的關聯中 |
| @OnetoOne | 定義表之間的一對一的關系 |
| @OneToMany | 定義表之間一對多的關系 |
| @ManyToOne | 定義表之間多對一的關系 |
| @ManyToMany | 定義表之間多對多的關系 |
3.映射關系的屬性
| targetEntity | 表示默認關聯的實體類型,默認為當前標注的實體類 |
| cascade | 表示與此實體一對一關聯的級聯樣式類型,以及當對實體進行操作時的策略 |
| fetch | 該實體的加載方式,包含LAZY和EAGER |
| optional | 表示關聯的實體是否能夠存在null值。默認為true,表示可以存在null值。如果為false,則要同時配合使用@JoinColumn標記 |
| mappedBy | 雙向關聯實體時使用,標注在不保存關系的實體中 |
| JoinColumn | 關聯指定列。該屬性值可接收多個@JoinColumn。用于配置連接表中外鍵列的信息。@JoinColumn配置的外鍵列參照當前實體對應表的主鍵列 |
| JoinTable | 兩張表通過中間的關聯表建立聯系時使用,即多對多關系 |
| PrimaryKeyJoinColumn | 主鍵關聯。在關聯的兩個實體中直接使用注解@PrimaryKeyJoinColumn注釋。 |
懶加載LAZY和實時加載EAGER的目的是:實現關聯數據的選擇性加載。
- 懶加載時在屬性被引用時才生成查詢語句,抽取相關聯數據。
- 實時加載則是執行完主查詢后,不管是否被引用,都會馬上執行后續的關聯數據查詢。
使用懶加載來調用關聯數據,必須要保證主查詢的Session(數據庫連接會話)的生命周期沒有結束,否則時無法抽取到數據的。
JPA接口
JPA提供了操作數據庫的接口。在開發過程中繼承和使用這些接口,可簡化現有的持久化開發工作。可以使用Spring找到自定義接口,并生成代理類,后續可以把自定義接口注入Spring容器中進行管理。在自定義接口過程中,可以不寫相關的SQL操作,由代理類自動生成。
JPA接口JpaRepository
JpaReposity繼承自PagingAndSortingRepository.該接口提供了JPA的相關實用功能,以及通過Example進行查詢的功能。Example對象是JPA提供用來構造查詢條件的對象。該接口的關鍵代碼如下
在上述代碼中,T表示實體對象,ID代表主鍵。ID必須實現序列化。
總結
- 上一篇: 计算机网络-后退N帧协议习题思考:数据帧
- 下一篇: AcWing 845. 八数码(3阶数字