JPA 一对一关联
在一对一关联中,JPA没有规定谁为关系的维护方,OneToOne的mapped属性值指定了由另外一方实体的某个属性来维护一对一关联。以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 @GeneratedValuepublic Integer getId() {return id;}@Column(length=20, nullable=false)public String getName() {return name;}@OneToOne(cascade={CascadeType.ALL},optional=false) // optional specified to false means the corresponding column couldn't be nullable@JoinColumn(name="idcard_id") // Indicate the column name of the foreign keypublic IDCard getIdcard() {return idcard;}// Setters are omitted}
@Entitypublic class IDCard {private Integer id;private String cardno;private Person person;public IDCard() {}public IDCard(String cardno) {this.cardno = cardno;}@Id @GeneratedValuepublic Integer getId() {return id;}@Column(length=18, nullable=false)public String getCardno() {return cardno;}// mappedBy specifies the property of the corresponding class that maintains the relationship. Also indicates this entity is the maintained edge.@OneToOne(mappedBy="idcard", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.REFRESH},optional=false, fetch=FetchType.EAGER) // Maintained edgepublic Person getPerson() {return person;}// Setters are omitted}
public void save() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");EntityManager em = factory.createEntityManager();Person person = new Person("Johnson");IDCard idcard = new IDCard("330818198602260444");// idcard.setPerson(person);person.setIdcard(idcard);em.getTransaction().begin(); // It's mandatory to open transaction to insert, update or delete data.em.persist(person);em.getTransaction().commit();em.close();factory.close();}
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();
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());}
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();}