先看代码:
1、人员实体
package cn.itcast.bean;
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;
@Entity  //通过@Entity注解指定此类为实体类
public class Person {private Integer id ;
private String name ;
private IDCard idcard ; //身份证号
public Person(){} // 提供一个无参构造函数public Person(String name){  // 为了添加更加数据方便而写的构造函数
  this.name = name ;
}@OneToOne(optional=false,cascade=CascadeType.ALL) // 不允许icard对象为null值
@JoinColumn(name="idcard_id")
public IDCard getIdcard() {  //每个人对应一张身份证
  return idcard;
}
public void setIdcard(IDCard idcard) {
  this.idcard = idcard;
}@Id @GeneratedValue  //指定标识符(主键)  //采用id自增长生成主键值
public Integer getId() {
  return id;
}
public void setId(Integer id) {
  this.id = id;
}@Column(length=10,nullable=false) //长度最长为10,不允许为空
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}}// 2、身份证实体
package cn.itcast.bean;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity  // 通过@Entity注解指定此类为实体类
public class IDCard {private Integer id ;
private String cardno ;
private Person person ;public IDCard(){} // 提供一个无参构造函数public IDCard(String cardno){ // 为了添加更加数据方便而写的构造函数
  this.cardno = cardno ;
}@OneToOne(mappedBy="idcard",optional=false,cascade={ //每张身份证对应一个人
   CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH}) 
public Person getPerson() {
  return person;
}
public void setPerson(Person person) {
  this.person = person;
}
@Id @GeneratedValue  //指定标识符(主键)  //采用id自增长生成主键值
public Integer getId() {
  return id;
}
public void setId(Integer id) {
  this.id = id;
}
@Column(length=18,nullable=false) //长度最长18位,不允许为空
public String getCardno() {
  return cardno;
}
public void setCardno(String cardno) {
  this.cardno = cardno;
}}//3、测试类package junit.test;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.itcast.bean.IDCard;
import cn.itcast.bean.Person;
public class OneToOneTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void testSave() {                  //此方法测试的时候表映射没问题,数据也存储到数据库表中了!
  
  EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast") ;
  EntityManager em = factory.createEntityManager() ;
  em.getTransaction().begin() ;
  
  Person person = new Person("老张") ;
  IDCard idcard = new IDCard("430723200001010001") ;
  idcard.setPerson(person) ;
  person.setIdcard(idcard) ;
  em.persist(person) ;
  
  em.getTransaction().commit() ;
  em.close() ;
  factory.close();

@Test
public void testSave2() {        //此方法测试的时候就报了异常!!!
  EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast") ;
  EntityManager em = factory.createEntityManager() ;
  em.getTransaction().begin() ;
  
  IDCard idcard = new IDCard("11111122222222") ;
  Person person = new Person("老牛") ;
  person.setIdcard(idcard) ;
  idcard.setPerson(person) ;
  em.persist(idcard) ;
  
  em.getTransaction().commit() ;
  em.close() ;
  factory.close();

}testSave1()   //此方法测试的时候表映射没问题,数据也存储到数据库表中了!testSave2() {        //此方法测试的时候就报了异常!!!异常信息如下:Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: cn.itcast.bean.Person.idcard
at org.hibernate.engine.Nullability.checkNullability我觉得testSave2() 方法是可行的,但是不知道是哪里出了问题!  IDCard实体和 Person实体都设置有级联保存操作,如果说保存Person的时候,IDCard实体也会跟着保存 ; 保存IDCard时候,Person 也会跟着保存!
理论上是每个人员实体都对于一个身份证实体,一个身份证同样也对于一个人员实体,testSave1()可以通过,
testSave2()问也应该可以通过,  但是问题出在哪儿了?   
求解决!!!