在一對(duì)一關(guān)聯(lián)中,JPA沒有規(guī)定誰為關(guān)系的維護(hù)方,OneToOne的mapped屬性值指定了由另外一方實(shí)體的某個(gè)屬性來維護(hù)一對(duì)一關(guān)聯(lián)。以Person和IDCard為例。
Person類:
- @Entity
- @Table(name="pillow")
- public class Person {
- private Integer id;
- private String name;
- private IDCard idcard;
- public Person() {
- }
- public Person(String name) {
- this.name = name;
- }
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
- @Column(length=20, nullable=false)
- public String getName() {
- return name;
- }
- @OneToOne(cascade={CascadeType.ALL},optional=false)
- @JoinColumn(name="idcard_id")
- public IDCard getIdcard() {
- return idcard;
- }
-
- }
- @Entity
- public class IDCard {
- private Integer id;
- private String cardno;
- private Person person;
- public IDCard() {
- }
- public IDCard(String cardno) {
- this.cardno = cardno;
- }
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
- @Column(length=18, nullable=false)
- public String getCardno() {
- return cardno;
- }
-
- @OneToOne(mappedBy="idcard", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.REFRESH},
- optional=false, fetch=FetchType.EAGER)
- public Person getPerson() {
- return person;
- }
-
- }
1. 測(cè)試保存- public void save() {
- EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");
- EntityManager em = factory.createEntityManager();
- Person person = new Person("Johnson");
- IDCard idcard = new IDCard("330818198602260444");
-
- person.setIdcard(idcard);
- em.getTransaction().begin();
- em.persist(person);
- em.getTransaction().commit();
- em.close();
- factory.close();
- }
當(dāng)IDCard的person屬性的optional為true時(shí),上面的idcard.setPerson(person)可以省略,因?yàn)镻erson既設(shè)置了級(jí)聯(lián)屬性cascade={CascadeType.ALL},在保存Person實(shí)體的時(shí)候也會(huì)保存IDcard,又是關(guān)系的維護(hù)方,在它們之間建立關(guān)聯(lián)。如果為false,在先保存idcard時(shí)候,由于not null約束,程序報(bào)錯(cuò)。
2. 測(cè)試更新:- EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- IDCard idcard = em.find(IDCard.class, 1);
- idcard.setCardno("330624198802060168");
- em.merge(idcard);
- em.getTransaction().commit();
- em.close();
- factory.close();
em.merge(idcard)可以省略,因?yàn)閕dcard已經(jīng)是托管態(tài)了,對(duì)它的修改在commit的時(shí)候都會(huì)提交到數(shù)據(jù)庫。如果idcard是游離態(tài)則需要該語句。
3. 測(cè)試查詢:- public void queryFromMaintained() {
- EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");
- EntityManager em = factory.createEntityManager();
- IDCard idcard = em.find(IDCard.class, 1);
- em.close();
- factory.close();
- System.out.println(idcard.getCardno());
- System.out.println(idcard.getPerson().getName());
- }
因?yàn)镮DCard實(shí)體的person屬性設(shè)置了fetch=FetchType.EAGER,jpa會(huì)使用一個(gè)SELECT連表查詢出Person和IDCard。
如果fetch設(shè)置為FetchType.LAZY,jpa會(huì)使用兩個(gè)SELECT語句(第一個(gè)查詢出IDCard,第二個(gè)連表查詢),不會(huì)產(chǎn)生EntityManager關(guān)閉導(dǎo)致的問題。
4. 測(cè)試刪除:- public void deleteFromMaintained() {
- EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- IDCard idcard = em.find(IDCard.class, 1);
- em.remove(idcard);
- em.getTransaction().commit();
- em.close();
- factory.close();
- }
當(dāng)IDCard的person屬性的optional為true時(shí),能刪除成功;為false時(shí)刪除會(huì)報(bào)錯(cuò):org.hibernate.PropertyValueException: not-null property references a null or transient value: com.john.bean.Person.idcard
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。