成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Hibernate 注解使用

Jinkey / 3166人閱讀

摘要:聲明添加對樂觀鎖定的支持一些屬性關(guān)聯(lián)關(guān)系獲取方式即是否采用延時(shí)加載及時(shí)加載,是在查詢數(shù)據(jù)時(shí),也直接一起獲取關(guān)聯(lián)對象的數(shù)據(jù)。在前面的基礎(chǔ)上增加課程類并補(bǔ)充學(xué)生類學(xué)生類負(fù)責(zé)關(guān)聯(lián)關(guān)系

Hibernate 注解使用

在Hibernate中通常配置對象關(guān)系映射關(guān)系有兩種,一種是基于xml的方式,另一種是基于Hibernate Annotation庫的注解方式。在Hibernate 3.2版本和Java 5 環(huán)境下開始支持使用注解配置對象關(guān)系映射,使用Hibernate注解之后,可不用定義持久化類所對應(yīng)的*.hbm.xml文件,直接用注解的方式寫入持久化類中實(shí)現(xiàn)

兩種方法要注意的兩個(gè)不同處:
(1):hibernate.hbm.xml 文件中把引用:xxx.hbm.xml改為引用實(shí)體類:

即把
改為:

(2):獲取SessionFactory方式發(fā)生了變化:

即把SessionFactorysf=newConfiguration().configure().buildSessionFactory()
改為SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory()

常用的注解標(biāo)簽

在屬性注解使用上,您既可以保持字段的持久性(注解寫在成員變量之上),也可以保持屬性(注解寫在getter方法之上)的持久性,但建議不要在屬性上引入注解,因?yàn)閷傩允莗rivate的,如果引入注解會破壞其封裝特性,所以建議在getter方法上加入注解

@Entity

將一個(gè)Javabean類聲明為一個(gè)實(shí)體的數(shù)據(jù)庫表映射類,最好實(shí)現(xiàn)序列化。默認(rèn)情況下,所有的類屬性都為映射到數(shù)據(jù)表的持久性字段。若在類中有屬性不映射到數(shù)據(jù)庫中的,要用下面的@Transient來注解。

*屬性:*
`name` - 可選,對應(yīng)數(shù)據(jù)庫中的一個(gè)表。若表名與實(shí)體類名相同,則可以省略。

@Table
在@Entity下使用,表示實(shí)體對應(yīng)數(shù)據(jù)庫中的表的信息

屬性:
name - 可選,表示表的名稱,默認(rèn)表名和實(shí)體名稱一致,不一致的情況下需指定表名。
catalog - 可選,表示Catalog名稱,默認(rèn)為 Catalog("")
schema - 可選 , 表示 Schema 名稱 , 默認(rèn)為Schema("")

@Entity()
@Table(name="Student")
public class Student implements Serializable{
}

@Id

必須,定義了映射到數(shù)據(jù)庫表的主鍵的屬性,一個(gè)實(shí)體只能有一個(gè)屬性被映射為主鍵

@GeneratedValue

定義自動增長的主鍵的生成策略.
屬性:
strategy - 表示主鍵生成策略,取值有以下

GenerationType.AUTO 根據(jù)底層數(shù)據(jù)庫自動選擇(默認(rèn)),若數(shù)據(jù)庫支持自動增長>類型,則為自動增長。
GenerationType.INDENTITY 根據(jù)數(shù)據(jù)庫的Identity字段生成,支持DB2、MySQL、MS、SQL Server、SyBase與HyperanoicSQL數(shù)據(jù)庫的Identity
GenerationType.SEQUENCE 使用Sequence來決定主鍵的取值,適合Oracle、DB2等支持Sequence的數(shù)據(jù)庫,一般結(jié)合@SequenceGenerator使用。(Oracle沒有自動增長類型,只能用Sequence)
GenerationType.TABLE 使用指定表來決定主鍵取值,結(jié)合@TableGenerator使用。
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int sid;

GenerationType.TABLE的使用

@Id  
@GeneratedValue(strategy=GenerationType.TABLE,generator="strategyName")   
@TableGenerator(
    name = "strategyName",   // 主鍵生成策略的名稱,它被引用在@GeneratedValue中設(shè)置的“generator”值中
    table="",   //表示表生成策略所持久化的表名   
    catalog="",   //表所在的目錄名
    schema="",   //數(shù)據(jù)庫名
    pkColumnName="",   //在持久化表中,該主鍵生成策略所對應(yīng)鍵值的名稱
    valueColumnName="",   //表示在持久化表中,該主鍵當(dāng)前所生成的值,它的值將會隨著每次創(chuàng)建累加  
    pkColumnValue="",   //表示在持久化表中,該生成策略所對應(yīng)的主鍵  
    allocationSize=1   //表示每次主鍵值增加的大小,例如設(shè)置成1,則表示每次創(chuàng)建新記錄后自動加1,默認(rèn)為50
)  

GenerationType.SEQUENCE的使用

@Id  
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="strategyName")   
@SequenceGenerator(
    name="strategyName", //name屬性表示該表主鍵生成策略的名稱,它被引用在@GeneratedValue中設(shè)置的“generator”值中
    sequenceName=""  //表示生成策略用到的數(shù)據(jù)庫序列名稱
) 

更多基于注解的Hibernate主鍵生成策略介紹

@Transient

將忽略這些字段和屬性,不用持久化到數(shù)據(jù)庫。

@Column

可將屬性映射到列,使用該注解來覆蓋默認(rèn)值
屬性:
name- 可選,表示數(shù)據(jù)庫表中該字段的名稱,默認(rèn)情形屬性名稱一致

length - 可選,表示該字段的大小,僅對 String 類型的字段有效,默認(rèn)值255.
insertable - 可選,表示在ORM框架執(zhí)行插入操作時(shí),該字段是否應(yīng)出現(xiàn)INSETRT 語句中,默認(rèn)為 true
updateable - 可選,表示在ORM 框架執(zhí)行更新操作時(shí),該字段是否應(yīng)該出現(xiàn)在 UPDATE 語句中,默認(rèn)為 true. 對于一經(jīng)創(chuàng)建就不可以更改的字段,該屬性非常有用,如對于 birthday 字段。
columnDefinition - 可選,表示該字段在數(shù)據(jù)庫中的實(shí)際類型。通常ORM 框架可以根 據(jù)屬性類型自動判斷數(shù)據(jù)庫中字段的類型,但是對于Date 類型仍無法確定數(shù)據(jù)庫中字段類型究竟是 DATE,TIME 還是 TIMESTAMP. 此外 ,String 的默認(rèn)映射類型為 VARCHAR, 如果要將 String 類型映射到特定數(shù)據(jù)庫的 BLOB或 TEXT 字段類型,該屬性非常有用。

@Version

聲明添加對樂觀鎖定的支持

一些屬性

fetch

關(guān)聯(lián)關(guān)系獲取方式,即是否采用延時(shí)加載
Fetch.EAGER - 及時(shí)加載,是在查詢數(shù)據(jù)時(shí),也直接一起獲取關(guān)聯(lián)對象的數(shù)據(jù)。多對一默認(rèn)是Fetch.EAGER
Fetch.LAZY -延遲加載,查詢數(shù)據(jù)時(shí),不一起查詢關(guān)聯(lián)對象的數(shù)據(jù)。而是當(dāng)訪問關(guān)聯(lián)對象時(shí)才觸發(fā)相應(yīng)的查詢操作,獲取關(guān)聯(lián)對象數(shù)據(jù)。一對多默認(rèn)是Fetch.LAZY

cascade

設(shè)置級聯(lián)方式
CascadeType.PERSIST 保存
CascadeType.REMOVE - 刪除
CascadeType.MERGE 修改
CascadeType.REFRESH 刷新
CascadeType.ALL - 全部

mappedBy

mappedBy指的是多方對一方的依賴的屬性,(注意:如果沒有指定由誰來維護(hù)關(guān)聯(lián)關(guān)系,則系統(tǒng)會給我們創(chuàng)建一張中間表)。
如果這個(gè)一對多的關(guān)系不是通過第三張表來維持,而是多方保存一方的id(多方外鍵引用一方),則必須要有mappedBy來指明多方中哪個(gè)變量來保存一方(外鍵),值是多方里面保存一方的屬性名字
在判斷到底是誰維護(hù)關(guān)聯(lián)關(guān)系時(shí),可以通過查看外鍵,哪個(gè)實(shí)體類定義了外鍵,哪個(gè)類就負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系
mappedBy相當(dāng)于xml配置中的inverse="true"

一對多關(guān)聯(lián)

@OneToMany

描述一個(gè)一對多的關(guān)聯(lián),該屬性應(yīng)該為集合類型 @OneToMany 默認(rèn)會使用連接表做一對多關(guān)聯(lián)
如果這個(gè)一對多的關(guān)系不是通過第三張表來維持,而是多方保存一方的id(多方外鍵引用一方),則必須要有mappedBy來指明多方中哪個(gè)變量來保存一方(外鍵),值是多方里面保存一方的屬性名字

@OneToMany(cascade={CascadeType.ALL},mappedBy="grade")
    public Set getStudents() {
        return students;
    }
多對一關(guān)聯(lián)

@ManyToOne

表示一個(gè)多對一的映射,該注解標(biāo)注的屬性通常是數(shù)據(jù)庫表的外鍵。 單向多對一關(guān)聯(lián)在多方:
@ManyToOne(targetEntity=XXXX.class) //指定關(guān)聯(lián)對象
@JoinColumn(name="") //指定產(chǎn)生的外鍵字段名

雙向一對多同雙向多對一

在多方
@ManyToOne
@JoinColumn(name="自己的數(shù)據(jù)庫外鍵列名")
在一方
@OneToMany(mappedBy="多端的關(guān)聯(lián)屬性名")

/*
 * 學(xué)生類負(fù)責(zé)關(guān)聯(lián)關(guān)系
 */
@Entity
@Table(name="Student")
public class Student implements Serializable{
    private int sid;
    private String sex;
    private String name;
    private Grade grade;
    public Student() {
        
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Id
    @GenericGenerator(name="generator",strategy="native")
    @GeneratedValue(generator="generator")
    public int getId() {
        return sid;
    }
    public void setId(int id) {
        this.sid = id;
    }
    @Column(name="sex")
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="gid")
    public Grade getGrade() {
        return grade;
    }
    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}
/*
 * 班級類
 */
@Entity
@Table(name="Grade")
public class Grade implements Serializable{
    private int gid;
    private String name;
    private Set students=new HashSet();
    public Grade() {
    }
    @Id
    @GenericGenerator(name="generator",strategy="native")
    @GeneratedValue(generator="generator")
    public int getGid() {
        return gid;
    }
    public void setGid(int gid) {
        this.gid = gid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @OneToMany(cascade={CascadeType.ALL},mappedBy="grade")
    public Set getStudents() {
        return students;
    }
    public void setStudents(Set students) {
        this.students = students;
    }
}
多對多關(guān)聯(lián)

在多對多關(guān)聯(lián)中,雙方都采用@ManyToMany. 其中被維護(hù)方mappedBy表示由另一多方維護(hù)
通過中間表由任一多方來維護(hù)關(guān)聯(lián)關(guān)系
其中主控方,不像一對多注解那樣,采用@joinColumn,而是采用@joinTable

 @JoinTable(
     name="student_course",
     joinColumns={@JoinColumn(name="")},
     inverseJoinColumns={@JoinColumn(name="")}
)

因?yàn)槎鄬Χ嘀g會通過一張中間表來維護(hù)兩表直接的關(guān)系,所以通過JoinTable 這個(gè)注解來聲明。
name就是指定了中間表的名字。
JoinColumns是一個(gè)@JoinColumn類型的數(shù)組,表示的是我這方在對方中的外鍵名稱,就是當(dāng)前類的主鍵。
inverseJoinColumns也是一個(gè)@JoinColumn類型的數(shù)組,表示的是對方在我這方中的外鍵名稱,也可以這樣想:上面提到mappedBy,相當(dāng)于inverse="true".所以,在@joinTable中的inverseJoinColumns中定義的字段為mappedBy所在類的主鍵。

在前面的基礎(chǔ)上增加課程類并補(bǔ)充學(xué)生類

/*
 * 學(xué)生類負(fù)責(zé)關(guān)聯(lián)關(guān)系
 */
@Entity
@Table(name="Student")
public class Student implements Serializable{
    private int sid;
    private String name;
    private String sex;
    private Grade grade;
    private Set courses=new HashSet();
    public Student() {
        
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Id
    @GenericGenerator(name="generator",strategy="native")
    @GeneratedValue(generator="generator")
    public int getId() {
        return sid;
    }
    public void setId(int id) {
        this.sid = id;
    }
    @Column(name="sex")
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name="gid")
    public Grade getGrade() {
        return grade;
    }
    public void setGrade(Grade grade) {
        this.grade = grade;
    }
    @ManyToMany(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
    @JoinTable(name="student_course",joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")})
    public Set getCourses() {
        return courses;
    }
    public void setCourses(Set courses) {
        this.courses = courses;
    }
}
@Entity
@Table(name="Course")
public class Course implements Serializable{

    private int cid;
    private String cName;
    private Set students=new HashSet();
    public Course() {
    }
    @Id
    @GenericGenerator(name="generator",strategy="native")
    @GeneratedValue(generator="generator")
    public int getCid() {
        return cid;
    }
    public void setStudents(Set students) {
        this.students = students;
    }
    public void setCid(int cid) {
        this.cid = cid;
    }
    public String getcName() {
        return cName;
    }
    public void setcName(String cName) {
        this.cName = cName;
    }
    @ManyToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY ,mappedBy="courses") 
    public Set getStudents() {
        return students;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67927.html

相關(guān)文章

  • 慕課網(wǎng)_《Hibernate注解》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期二說明本文部分內(nèi)容均來自慕課網(wǎng)。文件如下在目錄下,創(chuàng)建文件指定映射文件的路徑注解映射實(shí)體類可選,對應(yīng)數(shù)據(jù)庫中的一個(gè)表。 時(shí)間:2017年07月11日星期二說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:類級別注解 1-1 本章簡介 本章簡介 H...

    Jaden 評論0 收藏0
  • 利用注解對Bean進(jìn)行校驗(yàn)

    摘要:所以就有今天的話題利用注解對進(jìn)行校驗(yàn)。利用注解對進(jìn)行校驗(yàn),主要是利用框架,實(shí)現(xiàn)了的接口關(guān)于校驗(yàn)的接口,直接使用非常方便,省時(shí)省力。 最近寫業(yè)務(wù)代碼,因?yàn)轫撁鎻?fù)雜,導(dǎo)致對應(yīng)的Bean屬性非常多,而產(chǎn)品大佬又提出各種校驗(yàn)要求。 emmmmmm......如果寫if條件來校驗(yàn),那簡直是又臭又長。 所以就有今天的話題——利用注解對Bean進(jìn)行校驗(yàn)。 利用注解對Bean進(jìn)行校驗(yàn),主要是利用hib...

    dmlllll 評論0 收藏0
  • Hibernate 自定義表名映射

    摘要:所以設(shè)計(jì)的表名映射格式為,如果不加注解,則將實(shí)體名按照默認(rèn)的生成規(guī)則進(jìn)行生成,如果加了注解,則填寫的就作為表名映射,不進(jìn)行任何處理。云智命名策略實(shí)體與數(shù)據(jù)表名的關(guān)系配置然后將該項(xiàng)配置修改為我們自己建立的實(shí)現(xiàn)類。 問題描述 Hibernate映射介紹 Hibernate中,默認(rèn)的生成關(guān)系是將我們駝峰命名的實(shí)體進(jìn)行拼接下劃線同時(shí)轉(zhuǎn)小寫。 showImg(https://segmentfa...

    weij 評論0 收藏0
  • ssh(Spring+Struts2+hibernate)整合

    摘要:需求整合框架做一個(gè)保存用戶的業(yè)務(wù),業(yè)務(wù)比較簡單,重在框架整合。 需求:整合ssh框架做一個(gè)保存用戶的業(yè)務(wù),業(yè)務(wù)比較簡單,重在ssh框架整合。創(chuàng)建數(shù)據(jù)庫和表 CREATE DATABASE ssh01; USE DATABASE; 表由Hibernate創(chuàng)建,可以看配置是否成功 一:導(dǎo)入jar包 Hibernate需要jar Hibernate基本jar mysql驅(qū)動 ...

    tulayang 評論0 收藏0
  • 使用spring validation 作為數(shù)據(jù)校驗(yàn)

    摘要:本文主要介紹在中自動校驗(yàn)的機(jī)制。引入依賴我們使用構(gòu)建應(yīng)用來進(jìn)行演示。在中校驗(yàn)數(shù)據(jù)值得注意的地方參數(shù)前需要加上注解,表明需要對其進(jìn)行校驗(yàn),而校驗(yàn)的信息會存放到其后的中。層改寫方法限定需要進(jìn)行校驗(yàn),而方法則不做限制。 簡介 JSR303/JSR-349,hibernate validation,spring validation之間的關(guān)系。JSR303是一項(xiàng)標(biāo)準(zhǔn),JSR-349是其的升級版...

    huangjinnan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<