久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

JPA關(guān)系映射

 邵飛翔 2017-03-09

關(guān)聯(lián)關(guān)系映射,是映射關(guān)系中比較復(fù)雜的一種映射關(guān)系,總的說來有一對(duì)一,、一對(duì)多和多對(duì)多幾種關(guān)系。細(xì)分起來他們又有單向和雙向之分

多的一方為關(guān)系維護(hù)端,,關(guān)系維護(hù)端負(fù)責(zé)外鍵紀(jì)錄的更新,關(guān)系被維護(hù)端沒有權(quán)力更新外鍵紀(jì)錄。

擁有mappedBy注解的實(shí)體類為關(guān)系被維護(hù)端,,另外的實(shí)體類為關(guān)系維護(hù)端的,。關(guān)系的維護(hù)端負(fù)責(zé)對(duì)關(guān)系(在多對(duì)多為中間關(guān)聯(lián)表)的CRUD做操作。關(guān)系的被維護(hù)端不能進(jìn)行該操作,,不能維護(hù)關(guān)系,。

單向 OneToOne

單向一對(duì)一是關(guān)聯(lián)關(guān)系映射中最簡單的一種,簡單地說就是可以從關(guān)聯(lián)的一方去查詢另一方,卻不能反向查詢

單向一對(duì)一關(guān)系的擁有端

@Entity

public classPerson implements Serializable{

   @Id

   @GeneratedValue(strategy= GenerationType.AUTO)

   privateLong id;

   privateString name;

   privateint age;

   @OneToOne

   privateAddress address;

  //Getters&Setters

}

單向一對(duì)一關(guān)系的反端

@Entity

public classAddress implementsSerializable {

   @Id

   @GeneratedValue(strategy= GenerationType.AUTO)

   privateLong id;

   privateString street;

   privateString city;

  private String country;

  //Gettes& Setters

}

這種單向的一對(duì)一關(guān)系在數(shù)據(jù)庫中是以外鍵的形式被映射的。其中關(guān)系的發(fā)出端存儲(chǔ)一個(gè)指向關(guān)系的接收端的一個(gè)外鍵, 缺省情況下這個(gè)外鍵的字段名稱,,是以它指向的表的名稱加下劃線“_”加“ID”組成的, 當(dāng)然我們也可以根據(jù)我們的喜好來修改這個(gè)字段,,修改的辦法就是使用 @JoinColumn 這個(gè)注解

 

雙向 OneToOne

雙向一對(duì)一關(guān)系中的接受端

@Entity

 publicclassAddress implements Serializable {

   @Id

   @GeneratedValue(strategy= GenerationType.AUTO)

   privateLong id;

   privateString street;

   privateString city;

  private String country;

   @OneToOne(mappedBy="address")

  private Person person;

   //Gettes& Setters

}

雙向關(guān)系有一方為關(guān)系的擁有端,另一方是關(guān)系的反端,,也就是“Inverse”端,。在這里例子中 Person 擁有這個(gè)關(guān)系,而 Address 就是關(guān)系的“Inverse”端,。Address 中我們定義了一個(gè) person 屬性,,在這個(gè)屬性上我們使用了 @OneToOne 注解并且定義了他的“mappedBy”屬性,這個(gè)在雙向關(guān)系的“Inverse”端是必需的

雙向OneToMany

雙向一對(duì)多關(guān)系的接受端

@Entity

public class Person implementsSerializable {

       @Id

       @GeneratedValue(strategy= GenerationType.AUTO)

       privateLong id;

       privateString name;

       privateint age;

 

       @OneToMany(mappedBy= "person")

       privateList<CellPhone> cellPhones;

       //Getters and Setters

}

 

雙向一對(duì)多關(guān)系的發(fā)出端

@Entity

public class CellPhone implementsSerializable {

       @Id

       @GeneratedValue(strategy= GenerationType.AUTO)

       privateLong id;

 

       privateString manufacture;

       privateString color;

       privateLong  phoneNo;

       @ManyToOne

       privatePerson person;

       //Getters and Setters

}

 

單向 ManyToMany

多對(duì)多關(guān)聯(lián)關(guān)系中只能通過中間表的方式進(jìn)行映射

單向多對(duì)多關(guān)系的發(fā)出端

@Entity

public classTeacher implements Serializable {

       @Id

       @GeneratedValue(strategy =GenerationType.AUTO)

       private Long id;

       private String name;

       private Boolean gender;

       private int age;

       private int height;

       @ManyToMany

       private List<Student> students;

       // Getters  and Setters

}

單向多對(duì)多關(guān)系的反端

@Entity

public classStudent implements Serializable {

       @Id

       @GeneratedValue(strategy =GenerationType.AUTO)

       private Long id;

       private String name;

       private Boolean gender;

       private int age;

       private int height;

       //Getters and  Setters

}

 

雙向 ManyToMany

雙向多對(duì)多關(guān)系的擁有端

@Entity

public classTeacher implements Serializable {

       @Id

       @GeneratedValue(strategy =GenerationType.AUTO)

       private Long id;

       private String name;

       private Boolean gender;

       private int age;

       private int height;

       @ManyToMany

       private List<Student> students;

       // Getters  and Setters

}

 

雙向多對(duì)多關(guān)系的反端

@Entity

public classStudent implements Serializable {

       @Id

       @GeneratedValue(strategy =GenerationType.AUTO)

       private Long id;

       private String name;

       private Boolean gender;

       private int age;

       private int height;

       @ManyToMany(mappedBy = "students")

       private List<Teacher> teachers;

       //Getters and  Setters

}

 

 

JPA復(fù)合主鍵映射
一個(gè)實(shí)體的主鍵可能同時(shí)構(gòu)成,,當(dāng)且僅當(dāng)多個(gè)字段的值完全相同時(shí),,才認(rèn)為是相同的實(shí)體對(duì)象,。
復(fù)合主鍵映射時(shí),通常構(gòu)成將復(fù)合主鍵的多個(gè)字段單獨(dú)抽取出來建一個(gè)類作為符合主鍵類,。
符合主鍵類必須滿足以下幾點(diǎn)要求
必須實(shí)現(xiàn)Serializable接口,。
必須有默認(rèn)的public無參數(shù)的構(gòu)造方法。
必須覆蓋equals和hashCode方法,。equals方法用于判斷兩個(gè)對(duì)象是否相同,,EntityManger通過find方法來查找Entity時(shí),是根據(jù)equals的返回值來判斷的,。
@Embeddable
public class AirLinePK implements Serializable {
    @Column(nullable=false,length=3,name="LEAVECITY")
    private String leavecity;
    @Column(nullable=false,length=3,name="ARRIVECITY")
    private String arrivecity;
    public AirLinePK(){}
    public AirLinePK(String leavecity, String arrivecity) {
        this.leavecity = leavecity;
        this.arrivecity = arrivecity;
    }
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.leavecity!=null&& this.arrivecity!=null ? (this.leavecity+ "-"+this.arrivecity).hashCode() : 0);
        return hash;
    }
    @Override
    public boolean equals(Object object) {
        if (!(object instanceof AirLinePK)){
            returnfalse;
        }
        AirLinePK other = (AirLinePK)object;
        if (this.leavecity !=other.leavecity && (this.leavecity == null ||!this.leavecity.equalsIgnoreCase(other.leavecity))) return false;
        if (this.arrivecity !=other.arrivecity && (this.arrivecity == null ||!this.arrivecity.equalsIgnoreCase(other.arrivecity))) return false;
        return true;
    }
    //省略getter setter...
}
@Entity
public class AirLine implements Serializable {
    @EmbeddedId
    private AirLinePK id;
    @Column(length=15)
    private String airLineNum;
    public AirLine(){}
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.id != null ?this.id.hashCode() : 0);
        return hash;
    }
    @Override
    public boolean equals(Object object) {
        if (!(object instanceof AirLine)) {
            returnfalse;
        }
        AirLine other = (AirLine)object;
        if (this.id != other.id &&(this.id == null || !this.id.equals(other.id))) return false;
        return true;
    }
    //省略getter setter...
}
復(fù)合主鍵映射還有另一種映射方式
public class AirLinePK implements Serializable {
    @Column(length=3)
    private String leavecity;
    @Column(length=3)
    private String arrivecity;
    public AirLinePK(){}
    public AirLinePK(String leavecity, String arrivecity) {
        this.leavecity = leavecity;
        this.arrivecity = arrivecity;
    }
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.leavecity!=null&& this.arrivecity!=null ? (this.leavecity+ "-"+this.arrivecity).hashCode() : 0);
        return hash;
    }
    @Override
    public boolean equals(Object object) {
        if (!(object instanceof AirLinePK)){
            returnfalse;
        }
        AirLinePK other = (AirLinePK)object;
        if (this.leavecity !=other.leavecity && (this.leavecity == null ||!this.leavecity.equalsIgnoreCase(other.leavecity))) return false;
        if (this.arrivecity != other.arrivecity&& (this.arrivecity == null ||!this.arrivecity.equalsIgnoreCase(other.arrivecity))) return false;
        return true;
    }
    //省略getter setter
}

@Entity
@IdClass(AirLinePK.class)
public class AirLine implements Serializable {
    @Id private String leavecity;
    @Id private String arrivecity;
    @Column(length=15) private String airLineNum;
    public AirLine(){}
   //省略getter setter
}

 

javax.persistence.OneToOne

target Entity

表示該屬性關(guān)聯(lián)的實(shí)體類型.該屬性通常不必指定,ORM框架根據(jù)屬性類型自動(dòng)判斷targetEntity.

 

mappedBy

mappedBy 屬性是 String 類型的屬性,。mappedBy 屬性的值是當(dāng)前實(shí)體在關(guān)聯(lián)實(shí)體中的屬性名稱,使用 mappedBy 可以定義實(shí)體類之間的雙向關(guān)系,。

如果類之間是單向關(guān)系,,不需要提供定義

如果類和類之間形成雙向關(guān)系,我們就需要使用這個(gè)屬性進(jìn)行定義,,否則可能引起數(shù)據(jù)一致性的問題,。

 

cascade

cascade 屬性的類型是 CascadeType[] 類型。cascade 屬性定義實(shí)體和實(shí)體之間的級(jí)聯(lián)關(guān)系,??梢詮?/SPAN> CascadeType.PERSIST(級(jí)聯(lián)新建)、CascadeType.REMOVE(級(jí)聯(lián)刪除),、CascadeType.REFRESH(級(jí)聯(lián)刷新),、CascadeType.MERGE(級(jí)聯(lián)更新)中選擇一個(gè)或多個(gè)。還有一個(gè)更方便的選擇是使用 CascadeType.ALL,,表示選擇上面全部四項(xiàng),。

 

fetch

fetch 屬性是 FetchType 類型的屬性??蛇x擇項(xiàng)包括:FetchType.EAGER  FetchType.LAZY,。

前者表示關(guān)聯(lián)關(guān)系的從類在主類加載的時(shí)候同時(shí)加載,后者表示關(guān)聯(lián)關(guān)系的從類在自己被訪問時(shí)才加載,。

optional

optional 屬性是 boolean 類型的屬性,。是否允許該字段為null,該屬性應(yīng)該根據(jù)數(shù)據(jù)庫表的外鍵約束來確定,默認(rèn)為true。默認(rèn)值是 true,。


javax.persistence.JoinColumn

name

默認(rèn)為引用關(guān)系屬性/字段的名稱 +”_”+ 被引用的主鍵列的名稱

insertable

默認(rèn)情況下字段可以插入到所有表列中

nullable

是否允許所屬列包含空值

referencedColumnName

屬性指定關(guān)聯(lián)關(guān)系中的被維護(hù)端與關(guān)聯(lián)關(guān)系中的維護(hù)端對(duì)應(yīng)的表之間形成關(guān)聯(lián)關(guān)系的字段名稱,,默認(rèn)情況下假設(shè)在實(shí)體關(guān)系中,被引用的列名是被引用的主鍵列的名稱, 要指定其他列名,,請(qǐng)將 referencedColumnName 設(shè)置為所需的 String 列名,,通常用于關(guān)聯(lián)關(guān)系中的被維護(hù)端的關(guān)聯(lián)字段不是自己的主鍵的情況

table

實(shí)體的所有持久字段存儲(chǔ)到一個(gè)名稱為實(shí)體類名稱的數(shù)據(jù)庫表中

unique

JPA 持續(xù)性提供程序假設(shè)允許所有列包含重復(fù)值

updatable

默認(rèn)情況下,JPA 持續(xù)性提供程序假設(shè)它可以更新所有表列

columnDefinition


@OneToOne 注解定義
public @interface OneToOne{
     Class targetEntity( ) default void.class;
     CascadeType[] cascade( ) default {};
     FetchType fetch( ) default EAGER;
     boolean optional( ) default true;
     String mappedBy( ) default "";
}

 

@JoinColumn注解定義

@Target({METHOD,FIELD}) @Retention(RUNTIME)

public @interfaceJoinColumn {

String name() default "";

String referencedColumnName() default"";

boolean unique() default false;

boolean nullable() default true;

boolean insertable() default true;

boolean updatable() default true;

String columnDefinition() default"";

String table() default "";

}

 


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多