先看代码:
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()问也应该可以通过, 但是问题出在哪儿了?
求解决!!!
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()问也应该可以通过, 但是问题出在哪儿了?
求解决!!!
解决方案 »
- 字符串匹配正则表达式
- HTTP Status 404错误求助
- Hibernate如何在删除记录前判断外键依赖
- org.eclipse.core.runtime.Assert是那个包下面的?谢了
- 配置了OpenSessionInViewFilter,为什么还出现懒加载问题啊
- Eclipse IDE for Java EE 开发j2ee程序还需要哪些插件
- 用ant给ejb打包总提示这样的信息,为什么?
- 一个极其菜的问题:JAVA,VISUAL J++,JAVA SCRIPT,EJB,它们之间到底有什么关系,谢谢!
- JButton的监听 怎么让点击一个JButton弹出一个新的窗体
- springMvc中获取spring中的bean
- 请教大家一道面试题
- 关于hibernate
person.setIdcard(idcard) ;
idcard.setPerson(person) ;