JPA实现一对一

用JPA实现一对一的关系

1.IDCard.java

package com.cyberwise.jpa.one2one;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
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
@Table(name = "idcard_one2one")
public class IDCard implements Serializable{

	
	private Long version;

	private Integer id;

	private String cardNo;

	private Person_One2One person;
	
	public IDCard(){
		
	}
	
	public IDCard(String cardNo){
		this.cardNo  = cardNo;
	}

	@Version
	public Long getVersion() {
		return version;
	}

	public void setVersion(Long version) {
		this.version = version;
	}

	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(length = 18, nullable = false,unique=true)
	public String getCardNo() {
		return cardNo;
	}

	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}

	/*
	 * mappedBy:如何把IDCard指定为关系被维护端? 就是通过这属性。使用了这属性的类,就是关系被维护端。被维护端没有权力去更新外键字段。
	 * 
	 * cascade: CascadeType.REMOVE:删除身份证,需要把这个人干掉吗? 不用,所以这个属性不设。
	 * CascadeType.PERSIST:一出生就有身份证号。
	 * CascadeType.MERGE:在游离状态的时候,修改了身份证号码,需要对人员的信息进行修改么?如果有这种业务需求,就设上去。
	 * CascadeType.REFRESH:重新获取idCard的数据的时候,需不需要获取person的数据呢?
	 * 这些级联的定义,一定是根据你们的业务需求来定的。用不用是根据你的业务来决定的,业务需要就用,业务不需要就不用。
	 * optional:是否可选,是否允许为null?反映在业务上,就是有身份证,是否一定要有这个人呢?
	 * 因為在Person里已经指定了idCard是必须要存在的
	 * ,外键由person表维护,那么这里这个属性就是可选的的。设不设置这个person属性都行。
	 * 那么在这里option这属性就可以不再进行设置了,不设置不对我们的数据构成任何影响,person可有可无不对关系(外键)存在影响。
	 * 外键由Person的option属性决定
	 * ,就算你设置了这属性,其实它也不看你这属性。在设外键字段是否允许为空的时候,也不看这属性,而是看关系维护端的设定。
	 * fetch:加载行为默认为立刻记载,凭one。
	 */

	@OneToOne(mappedBy = "idcard", cascade = { CascadeType.PERSIST,
			CascadeType.MERGE, CascadeType.REFRESH })
	public Person_One2One getPerson() {
		return person;
	}

	public void setPerson(Person_One2One person) {
		this.person = person;
	}

}



2.Person_One2One.java
package com.cyberwise.jpa.one2one;

import java.io.Serializable;

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="person_one2one")
public class Person_One2One implements Serializable{
	
	private Long version;
	
	private Integer id;
	
	private String name;
	
	private IDCard idcard;
	
	public Person_One2One(){
		
	}
	
	@Version
	public Long getVersion() {
		return version;
	}

	public void setVersion(Long version) {
		this.version = version;
	}

	@Id
	@GeneratedValue
	//采用数据库Id自动增长的方式来生成主键
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(name="p_name",length=10,nullable=false)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@OneToOne(optional=false,cascade=CascadeType.ALL)
	@JoinColumn(name="idcard_id")
	public IDCard getIdcard() {
		return idcard;
	}

	public void setIdcard(IDCard idcard) {
		this.idcard = idcard;
	}

}



3.OneToOneTest.java 测试类

package com.cyberwise.jpa.one2one;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.jboss.seam.annotations.In;

import com.cyberwise.jpa.person.Person;

public class OneToOneTest {
	
	@In
	EntityManagerFactory factory;
	
	@In
	EntityManager manager;
	
	public void save(){
		factory = Persistence.createEntityManagerFactory("test");
		manager = factory.createEntityManager();
		manager.getTransaction().begin();
		
		Person_One2One p = new Person_One2One();
		p.setName("阿奴");//Person是关系维护端
		p.setIdcard(new IDCard("100003"));//通过Person把idCard放进去,这关系就由Person来维护
		
		manager.persist(p);
		manager.getTransaction().commit();
		
		manager.close();
		factory.close();
	}
	
	 public void update(){
		 factory = Persistence.createEntityManagerFactory("test");
		 manager = factory.createEntityManager();
		 manager.getTransaction().begin();
		 
		 String sql = "update  IDCard i set i.cardNo=:cardNo where  i.id=:id";
		 Query query = manager.createQuery(sql);
			
			query.setParameter("cardNo", "100005");
			query.setParameter("id", 7);
			query.executeUpdate();
		 
		 manager.getTransaction().commit();
		 
		 manager.close();
		 factory.close();
	 }
	
	public static void main(String[] args) {
		
		OneToOneTest test = new OneToOneTest();
//		test.save();
		test.update();
	}

}

你可能感兴趣的:(sql,jboss,jpa,seam)