關(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ù)合主鍵映射
javax.persistence.OneToOne target Entity 表示該屬性關(guān)聯(lián)的實(shí)體類型.該屬性通常不必指定,ORM框架根據(jù)屬性類型自動(dòng)判斷targetEntity.
mappedBy
如果類之間是單向關(guān)系,,不需要提供定義 如果類和類之間形成雙向關(guān)系,我們就需要使用這個(gè)屬性進(jìn)行定義,,否則可能引起數(shù)據(jù)一致性的問題,。
cascade
fetch
前者表示關(guān)聯(lián)關(guān)系的從類在主類加載的時(shí)候同時(shí)加載,后者表示關(guān)聯(lián)關(guān)系的從類在自己被訪問時(shí)才加載,。 optional
javax.persistence.JoinColumnname
insertable
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)系的字段名稱,, table 實(shí)體的所有持久字段存儲(chǔ)到一個(gè)名稱為實(shí)體類名稱的數(shù)據(jù)庫表中 unique JPA 持續(xù)性提供程序假設(shè)允許所有列包含重復(fù)值 updatable 默認(rèn)情況下,JPA 持續(xù)性提供程序假設(shè)它可以更新所有表列 columnDefinition @OneToOne 注解定義
@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 ""; }
|
|