日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring Data JPA 从入门到精通~基本注解

發(fā)布時(shí)間:2024/7/23 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Data JPA 从入门到精通~基本注解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?@Entity、@Table、@Id、@GeneratedValue、@Basic、@Column、@Transient、@Lob、@Temporal

先看一個(gè) Blog 的案例其中實(shí)體的配置如下:

@Entity @Table(name = "user_blog", schema = "test") public class UserBlogEntity {@Id@Column(name = "id", nullable = false)@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@Column(name = "title", nullable = true, length = 200)private String title;@Basic@Column(name = "create_user_id", nullable = true)private Integer createUserId;@Basic@Column(name = "blog_content", nullable = true, length = -1)@Lobprivate String blogContent;@Basic(fetch = FetchType.LAZY)@Column(name = "image", nullable = true)@Lobprivate byte[] image;@Basic@Column(name = "create_time", nullable = true)@Temporal(TemporalType.TIMESTAMP)private Date createTime;@Basic@Column(name = "create_date", nullable = true)@Temporal(TemporalType.DATE)private Date createDate;@Transientprivate String transientSimple; ...... }

下面對(duì)上面類(lèi)中用到的注解來(lái)一一解釋一下。

(1)@Entity 用于定義對(duì)象將會(huì)成為被 JPA 管理的實(shí)體,將字段映射到指定的數(shù)據(jù)庫(kù)表中,源碼如下:

public @interface Entity {//可選,默認(rèn)是次實(shí)體類(lèi)的名字,全局唯一。String name() default ""; }

(2)@Table 用于指定數(shù)據(jù)庫(kù)的表名:

public @interface Table {//表的名字,可選。如果不填寫(xiě),系統(tǒng)認(rèn)為好實(shí)體的名字一樣為表名。String name() default "";//此表的catalog,可選String catalog() default "";//此表所在schema,可選String schema() default "";//唯一性約束,只有創(chuàng)建表的時(shí)候有用,默認(rèn)不需要。UniqueConstraint[] uniqueConstraints() default { };//索引,只有創(chuàng)建表的時(shí)候使用,默認(rèn)不需要。Index[] indexes() default {}; }

(3)@Id 定義屬性為數(shù)據(jù)庫(kù)的主鍵,一個(gè)實(shí)體里面必須有一個(gè),并且必須和 @GeneratedValue 配合使用和成對(duì)出現(xiàn)。

(4)@IdClass 利用外部類(lèi)的聯(lián)合主鍵,源碼:

public @interface IdClass { //聯(lián)合主鍵的類(lèi)Class value(); }

作為符合主鍵類(lèi),要滿(mǎn)足以下幾點(diǎn)要求。

  • 必須實(shí)現(xiàn) Serializable 接口。
  • 必須有默認(rèn)的 public 無(wú)參數(shù)的構(gòu)造方法。
  • 必須覆蓋 equals 和 hashCode 方法。equals 方法用于判斷兩個(gè)對(duì)象是否相同,EntityManger 通過(guò) find 方法來(lái)查找 Entity 時(shí),是根據(jù) equals 的返回值來(lái)判斷的。本例中,只有對(duì)象的 name 和 email 值完全相同時(shí)或同一個(gè)對(duì)象時(shí)則返回 true,否則返回 false。hashCode 方法返回當(dāng)前對(duì)象的哈希碼,生成 hashCode 相同的概率越小越好,算法可以進(jìn)行優(yōu)化。

(5)@IdClass 用法

5.1)假設(shè) UserBlog 的聯(lián)合主鍵是 createUserId 和 title,新增一個(gè) UserBlogKey 的類(lèi)。

UserBlogKey.class

import java.io.Serializable; public class UserBlogKey implements Serializable {private String title;private Integer createUserId;public UserBlogKey() {}public UserBlogKey(String title, Integer createUserId) {this.title = title;this.createUserId = createUserId;} .....//get set 方法我們略過(guò) }

5.2)UserBlogEntity.java 稍加改動(dòng),實(shí)體類(lèi)上需要加 @IdClass 注解和兩個(gè)主鍵上都得加 @Id 注解,如下。

@Entity @Table(name = "user_blog", schema = "test") @IdClass(value = UserBlogKey.class) public class UserBlogEntity {@Column(name = "id", nullable = false)private Integer id;@Id@Column(name = "title", nullable = true, length = 200)private String title;@Id@Column(name = "create_user_id", nullable = true)private Integer createUserId; ......//不變的部分我們省略 }

5.3)UserBlogRepository 我們做的改動(dòng):

public interface UserBlogRepository extends JpaRepository<UserBlogEntity,UserBlogKey>{ }

5.4)使用的時(shí)候:

@RequestMapping(path = "/blog/{title}/{createUserId}") @ResponseBody public Optional<UserBlogEntity> showBlogs(@PathVariable(value = "createUserId") Integer createUserId,@PathVariable("title") String title) {return userBlogRepository.findById(new UserBlogKey(title,createUserId)); }

(6)@GeneratedValue 主鍵生成策略:

public @interface GeneratedValue {//Id的生成策略GenerationType strategy() default AUTO;//通過(guò)Sequences生成Id,常見(jiàn)的是Orcale數(shù)據(jù)庫(kù)ID生成規(guī)則,這個(gè)時(shí)候需要配合@SequenceGenerator使用String generator() default ""; }

GenerationType 一共有以下四個(gè)值:

public enum GenerationType {//通過(guò)表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫(kù)移植。TABLE,//通過(guò)序列產(chǎn)生主鍵,通過(guò) @SequenceGenerator 注解指定序列名, MySql 不支持這種方式;SEQUENCE,//采用數(shù)據(jù)庫(kù)ID自增長(zhǎng), 一般用于mysql數(shù)據(jù)庫(kù)IDENTITY, //JPA 自動(dòng)選擇合適的策略,是默認(rèn)選項(xiàng);AUTO }

(7)@Basic 表示屬性是到數(shù)據(jù)庫(kù)表的字段的映射。如果實(shí)體的字段上沒(méi)有任何注解,默認(rèn)即為 @Basic。

public @interface Basic {//可選,EAGER(默認(rèn)):立即加載;LAZY:延遲加載。(LAZY主要應(yīng)用在大字段上面)FetchType fetch() default EAGER;//可選。這個(gè)字段是否可以為null,默認(rèn)是true。boolean optional() default true; }

(8)@Transient 表示該屬性并非一個(gè)到數(shù)據(jù)庫(kù)表的字段的映射,表示非持久化屬性。JPA 映射數(shù)據(jù)庫(kù)的時(shí)候忽略它,與 @Basic 相反的作用。

(9)@Column 定義該屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)中的列名。

public @interface Column {//數(shù)據(jù)庫(kù)中的表的列名;可選,如果不填寫(xiě)認(rèn)為字段名和實(shí)體屬性名一樣。String name() default "";//是否唯一。默認(rèn)flase,可選。boolean unique() default false;//數(shù)據(jù)字段是否允許空。可選,默認(rèn)true。boolean nullable() default true;//執(zhí)行insert操作的時(shí)候是否包含此字段,默認(rèn),true,可選。boolean insertable() default true;//執(zhí)行update的時(shí)候是否包含此字段,默認(rèn),true,可選。boolean updatable() default true;//表示該字段在數(shù)據(jù)庫(kù)中的實(shí)際類(lèi)型。String columnDefinition() default "";//數(shù)據(jù)庫(kù)字段的長(zhǎng)度,可選,默認(rèn)255int length() default 255; }

(10)@Temporal 用來(lái)設(shè)置 Date 類(lèi)型的屬性映射到對(duì)應(yīng)精度的字段。

  • @Temporal(TemporalType.DATE)映射為日期 // date (只有日期)
  • @Temporal(TemporalType.TIME)映射為日期 // time (是有時(shí)間)
  • @Temporal(TemporalType.TIMESTAMP)映射為日期 // date time (日期+時(shí)間)

(11)@Enumerated 這個(gè)注解很好用,直接映射 enum 枚舉類(lèi)型的字段。

1)看源碼:

public @interface Enumerated { //枚舉映射的類(lèi)型,默認(rèn)是ORDINAL(即枚舉字段的下標(biāo))。EnumType value() default ORDINAL; } public enum EnumType {//映射枚舉字段的下標(biāo)ORDINAL,//映射枚舉的NameSTRING }

2)看例子:

//有一個(gè)枚舉類(lèi),用戶(hù)的性別 public enum Gender {MAIL("男性"), FMAIL("女性");private String value;private Gender(String value) {this.value = value;} } //實(shí)體類(lèi)@Enumerated的寫(xiě)法如下 @Entity @Table(name = "tb_user") public class User implements Serializable {@Enumerated(EnumType.STRING)@Column(name = "user_gender")private Gender gender;....................... }

這時(shí)候插入兩條數(shù)據(jù),數(shù)據(jù)庫(kù)里面的值是 MAIL/FMAIL,而不是“男性”/女性。

如果我們用 @Enumerated(EnumType.ORDINAL),這時(shí)候數(shù)據(jù)庫(kù)里面的值是 0,1。但是實(shí)際工作中,不建議用數(shù)字下標(biāo),因?yàn)槊杜e里面的屬性值是會(huì)不斷新增的,如果新增一個(gè),位置變化了就慘了。

(12)@Lob 將屬性映射成數(shù)據(jù)庫(kù)支持的大對(duì)象類(lèi)型,支持以下兩種數(shù)據(jù)庫(kù)類(lèi)型的字段。

  • Clob(Character Large Ojects)類(lèi)型是長(zhǎng)字符串類(lèi)型,java.sql.Clob、Character[]、char[] 和 String 將被映射為 Clob 類(lèi)型。
  • Blob(Binary Large Objects)類(lèi)型是字節(jié)類(lèi)型,java.sql.Blob、Byte[]、byte[]和實(shí)現(xiàn)了 Serializable 接口的類(lèi)型將被映射為 Blob 類(lèi)型。
  • 由于 Clob,Blob 占用內(nèi)存空間較大一般配合 @Basic(fetch=FetchType.LAZY) 將其設(shè)置為延遲加載。

(13)@SqlResultSetMapping、@EntityResult、@ColumnResult 配合 @NamedNativeQuery 一起使用的。

在實(shí)際工作中不建議這樣配置,因?yàn)楸匾员容^少,如果這種配置多了會(huì)把 @entity 用配置 XML 思路??匆粋€(gè)案例簡(jiǎn)單說(shuō)明一下:

@NamedNativeQueries({@NamedNativeQuery(name = "getUsers",query = "select id,username,usertype from t_xfw_operator order by id desc",resultSetMapping = "usersMap") }) @SqlResultSetMappings({@SqlResultSetMapping(name = "usersMap",entities = {},columns = {@ColumnResult(name = "id"),@ColumnResult(name="username"),@ColumnResult(name="usertype")}) }) @Entity @Table(name = "operator") public class Operator { ...... }

總結(jié)

以上是生活随笔為你收集整理的Spring Data JPA 从入门到精通~基本注解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩精品成人无码专区免费 | 亚洲av无码一区二区三区人 | 欧美三个黑人玩3p | 一级视频在线播放 | 美女黄色在线观看 | 在线观看免费毛片 | 欧美国产一区二区在线观看 | 亚洲欧美中文日韩在线 | 国产在线一二三区 | 777午夜| 日韩精品一线二线三线 | 国产欧美亚洲精品 | 免费在线你懂的 | 一区二区三区午夜 | 国产在线超碰 | 免费一级特黄3大片视频 | 黄色动漫在线免费观看 | 欧美成人福利视频 | 美女色诱男人激情视频 | 国产精品视频网址 | 狠狠爱亚洲 | 国产成人免费视频网站 | 精品人妻久久久久一区二区三区 | 久久精品女人毛片国产 | 日b在线观看 | 色噜噜日韩精品欧美一区二区 | 国产乱淫av一区二区三区 | 国产精品久久久久久久专区 | 国产精品三级视频 | 狠狠2020| 黄色一级视频免费观看 | 91精品国产福利在线观看 | 日本一二三区视频 | 日本高潮视频 | 爱逼综合 | 九九午夜 | 在线你懂的 | 手机看片福利视频 | 亚洲综合免费 | 乱熟女高潮一区二区在线 | 国产又粗又猛又爽又黄的网站 | 三级视频久久 | 欧美亚洲国产一区 | 筱田优av | 欧美三级欧美成人高清 | 男人的天堂伊人 | 人人亚洲| 黄色一级视频免费观看 | 亚洲视频自拍偷拍 | www.中文字幕 | 亚洲专区欧美 | 农村少妇无套内谢粗又长 | 亚洲精品国产乱伦 | 欧美精品福利视频 | 欧美xxxx黑人又粗又长密月 | 极品探花在线观看 | 天天干天天爽天天操 | av免费在线观看网址 | 国产freexxxx性播放麻豆 | 少妇又色又紧又爽又刺激视频 | 婷婷中文字幕 | 欧美激情久久久久 | 久久久久久逼 | 三级a视频 | 无码av免费毛片一区二区 | 每日av在线 | 黄色二级视频 | 亚洲美女av网站 | 一区二区三区免费观看 | 国产小视频一区 | 色狠狠av| 国产中文字幕网 | 97国产精品视频 | 日本美女裸体视频 | 黄色岛国片 | av成人动漫 | 91se在线| 亚洲欧美www| 中文字幕免费高 | 欧美大胆a视频 | 亚洲福利一区二区三区 | 韩日一区二区三区 | 久久久久久国产免费a片 | 亚洲综合激情小说 | 欧美午夜精品一区二区 | 亚洲人天堂 | 91午夜理伦私人影院 | 国产精品久久久久久亚洲调教 | 亚洲精品在线91 | 91成人破解版 | 国产精品成人无码 | 一区二区三区在线视频观看 | 色欲av无码精品一区 | 福利在线免费视频 | 国产白丝袜美女久久久久 | 国产三级理论 | 翔田千里x88aⅴ | 国产第十页 | 中文字幕一区二区三区精品 |