JPA 双向一对一联系关系(@OneToOne)

JPA 双向一对一关联(@OneToOne)
   通过上一节配置的映射,只能通过实体CustomerEO对象获得AddressEO对象,是单向关联。若要使AddressEO对象获得CustomerEO对象,需要在AddressEO中增加对CustomerEO对象的引用。
    实体类:Customer_2.java
package com.demo.bean.onetoone2;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Version;

@Entity
@Table(name = "t_Customer_2")
public class Customer_2 {

	@Version
	private Long version;

	@Id
	@GeneratedValue
	private Long id;//客户ID
	
	@Column
	public String name;//客户名称	
	
	//onetoone
	@OneToOne(cascade={CascadeType.ALL})
	@JoinColumn(name="address_id")
	public Address_2 address;		
	
	public Customer_2(){		
	}	
	//-----------------可省get,set--------------			
}

     实体类:Address_2.java
package com.demo.bean.onetoone2;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Version;

/**
 * entity Address_2
 * @author ALEX
 *
 */
@Entity
@Table(name="t_address_2")
public class Address_2 {
	
	@Version
	private Long version;//version
	
	@Id
	@GeneratedValue
	private Long id;//id
		
	public String province;//省份
	
	public String city;//城市
	
	public String postcode;//邮编
	
	public String detail;//详细地址
	
	/**
	 * 
	 * 也能够通过AddressEO获得CustomerEO实体
	 *
	 */
	[color=blue]@OneToOne(mappedBy="address")[/color]	public Customer_2 customer;

	//----------get,set可省------------
}

   测试类TestJPA.java
package com.demo.bean.onetoone2;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class TestJPA {

	/**
	 * 测试jpa注解
	 * @param args
	 */
	public static void main(String[] args) {

		EntityManagerFactory emf = Persistence.createEntityManagerFactory("tpdb");
		
		EntityManager em = emf.createEntityManager();
		EntityTransaction et = em.getTransaction();
		
		et.begin();
		
	    saveOneToOne(em);
	    et.commit();
	    
	    //查询
	  //通过Customer获得Address
	    Customer_2 customer = em.find( Customer_2.class, new Long(1));
	    Address_2 address = customer.getAddress();
	    System.out.println("cu---ad--"+address.getDetail());	    
	  //通过Address获得对应Customer
	    Address_2 adct = em.find( Address_2.class, new Long(1));
	    Customer_2 ctad = adct.getCustomer();
	    System.out.println("ad----ct---"+ctad.getName());
	    System.out.println("ad---ct--"+ctad.getAddress());		  }
	
	public static List getAllCustomer(EntityManager em){
		
		return em.createQuery("select c from Customer c").getResultList();
	}
		
	public static List getAllAddress(EntityManager em){
		
		return em.createQuery("select a from Address a").getResultList();
	}
		
	//双向one to one
	private static void saveOneToOne(EntityManager em){
		
		Customer_2 ct = new Customer_2();
		ct.setName("小q");
		
		Address_2 ad = new Address_2();
		ad.setProvince("北京省");
		ad.setCity("朝阳市");
		ad.setPostcode("254600");
		ad.setDetail("天心区");
		
	    ct.setAddress( ad );
	    ad.setCustomer( ct );
	    em.persist( ct );		
	}	
}