JPA实现一对一

[color=red]用JPA实现一对一的关系[/color]

[color=red]1.IDCard.java [/color]


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;
}

}



[color=red]2.Person_One2One.java [/color]

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;
}

}



[color=red]3.OneToOneTest.java 测试类[/color]


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();
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值