后台报错信息:15:22:53,750 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, IntrceptorRegistry should be used via the bean container
15:22:53,750 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, IntrceptorRegistry should be used via the bean container
15:22:53,750 WARN [InterceptorRegistry] applicable interceptors is non-existent for public huizhi.entity.Person huizhisessionbean.Personbean.getPersonByCid(java.lang.String)
15:22:53,765 WARN [InterceptorRegistry] applicable interceptors is non-existent for public void huizhi.sessionbean.Peronbean.updatePerson(huizhi.entity.Person,java.lang.String)
15:22:53,765 WARN [InterceptorRegistry] applicable interceptors is non-existent for public void huizhi.sessionbean.Peronbean.addPerson(java.lang.String,int,java.lang.String,java.lang.String,java.lang.String,java.util.Date)
15:22:53,765 WARN [InterceptorRegistry] applicable interceptors is non-existent for public huizhi.entity.Person huizhisessionbean.Personbean.getPersonByCid(java.lang.String)
15:22:53,781 WARN [InterceptorRegistry] applicable interceptors is non-existent for public void huizhi.sessionbean.Peronbean.updatePerson(huizhi.entity.Person,java.lang.String)
15:22:53,781 WARN [InterceptorRegistry] applicable interceptors is non-existent for public void huizhi.sessionbean.Peronbean.addPerson(java.lang.String,int,java.lang.String,java.lang.String,java.lang.String,java.util.Date)
15:22:53,781 INFO [STDOUT] -- 持久化过程中发生异常 --
15:22:53,781 INFO [STDOUT] org.hibernate.PersistentObjectException: detached entity passed to persist: huizhi.entity.Card
16:15:17,281 INFO [STDOUT] -- 持久化过程中发生异常 --
16:15:17,296 INFO [STDOUT] org.hibernate.PersistentObjectException: detached entity passed to persist: huizhi.entity.Card出错所在的方法:@PersistenceContext(unitName="YingShe_PU")protected EntityManager em;
public void addPerson(String name, int age, String phone, String address,
String cid, Date valDate) {
Person p = new Person();
Card c = new Card();
c.setCid(cid);
c.setValDate(valDate);
c.setPerson(p);
p.setName(name);
p.setAddress(address);
p.setAge(age);
p.setCard(c);
p.setPhone(phone);
em.persist(p);
}
15:22:53,750 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, IntrceptorRegistry should be used via the bean container
15:22:53,750 WARN [InterceptorRegistry] applicable interceptors is non-existent for public huizhi.entity.Person huizhisessionbean.Personbean.getPersonByCid(java.lang.String)
15:22:53,765 WARN [InterceptorRegistry] applicable interceptors is non-existent for public void huizhi.sessionbean.Peronbean.updatePerson(huizhi.entity.Person,java.lang.String)
15:22:53,765 WARN [InterceptorRegistry] applicable interceptors is non-existent for public void huizhi.sessionbean.Peronbean.addPerson(java.lang.String,int,java.lang.String,java.lang.String,java.lang.String,java.util.Date)
15:22:53,765 WARN [InterceptorRegistry] applicable interceptors is non-existent for public huizhi.entity.Person huizhisessionbean.Personbean.getPersonByCid(java.lang.String)
15:22:53,781 WARN [InterceptorRegistry] applicable interceptors is non-existent for public void huizhi.sessionbean.Peronbean.updatePerson(huizhi.entity.Person,java.lang.String)
15:22:53,781 WARN [InterceptorRegistry] applicable interceptors is non-existent for public void huizhi.sessionbean.Peronbean.addPerson(java.lang.String,int,java.lang.String,java.lang.String,java.lang.String,java.util.Date)
15:22:53,781 INFO [STDOUT] -- 持久化过程中发生异常 --
15:22:53,781 INFO [STDOUT] org.hibernate.PersistentObjectException: detached entity passed to persist: huizhi.entity.Card
16:15:17,281 INFO [STDOUT] -- 持久化过程中发生异常 --
16:15:17,296 INFO [STDOUT] org.hibernate.PersistentObjectException: detached entity passed to persist: huizhi.entity.Card出错所在的方法:@PersistenceContext(unitName="YingShe_PU")protected EntityManager em;
public void addPerson(String name, int age, String phone, String address,
String cid, Date valDate) {
Person p = new Person();
Card c = new Card();
c.setCid(cid);
c.setValDate(valDate);
c.setPerson(p);
p.setName(name);
p.setAddress(address);
p.setAge(age);
p.setCard(c);
p.setPhone(phone);
em.persist(p);
}
解决方案 »
- win7 hibernate3.1向mysql 5.5插入中文报错
- 关于s:iterator 为什么页面显示不了结果,控制台也有结果输出~~还有,怎么把这个迭代放到select的option中?求教。。。
- jsp的tag变量问题
- 计算机专业 没学过数电 模电 学习嵌入式????请教
- 求救!!!!myeclipse 创建补了class和interface!
- osworkflow-2.8.0的例子跑不通
- 寻找JSP同道中人
- 请教几个初学者会碰到的问题?
- 大哥大姐java application 是什么东西?
- 简单又高分的问题
- spring2.5.6实现注解AOP出现奇怪错误
- 这个servelt改成jsp代码
Card c = new Card();
c.setCid(cid);先保存c.试试;
em.persist(c);
em.persist(p);
就是改成先对 Card 持久化,后台也会报出同样的问题:09:36:52,171 INFO [STDOUT] -- 持久化过程中发生异常 --
09:36:52,171 INFO [STDOUT] org.hibernate.PersistentObjectException: detached entity passed to persist: huizhi.entity.Card09:36:52,171 INFO [STDOUT] Hibernate:
select
person0_.id as id16_,
person0_.address as address16_,
person0_.age as age16_,
person0_.cardid as cardid16_,
person0_.name as name16_,
person0_.phone as phone16_
from
person person0_
where
person0_.cardid=?页面显示的的内容是:
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of huizhi.entity.Card.cid
public void addPerson(String name, int age, String phone, String address,
String cid, Date valDate) {
Person p = new Person();
Card c = new Card();
c.setCid(cid);
c.setValDate(valDate);
c.setPerson(p);
p.setName(name);
p.setAddress(address);
p.setAge(age);
p.setPhone(phone); em.persist(c); p.setCard(c);
em.persist(p);
}
这样试试呢
你好,我这个实体类定义getcid方法了。是在em.persist(p)的时候报的,不能持久化card异常,card表和person表是双向一对一映射的。
按你这方法也不行,页面抛出的异常信息是:javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction
Card实体package huizhi.entity;import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
/**
* The persistent class for the card database table.
*
*/
@Entity
@Table(name="card")
public class Card implements Serializable {
private static final long serialVersionUID = 1L; @Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique=true, nullable=false, length=18)
private String cid; @Temporal( TemporalType.DATE)
@Column(nullable=false)
private Date valDate; //bi-directional one-to-one association to Person
@OneToOne(cascade={CascadeType.MERGE, CascadeType.REMOVE}, optional = false, mappedBy = "card")
private Person person; public Card() {
} public String getCid() {
return this.cid;
} public void setCid(String cid) {
this.cid = cid;
} public Date getValDate() {
return this.valDate;
} public void setValDate(Date valDate2) {
this.valDate = valDate2;
} public Person getPerson() {
return this.person;
} public void setPerson(Person person) {
this.person = person;
}
}
Person实体
package huizhi.entity;import java.io.Serializable;
import javax.persistence.*;
/**
* The persistent class for the person database table.
*
*/
@Entity
@Table(name="person")
public class Person implements Serializable {
private static final long serialVersionUID = 1L; @Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id; @Column(length=50)
private String address; private int age; @Column(nullable=false, length=20)
private String name; @Column(length=15)
private String phone; @OneToOne(optional = true, cascade = CascadeType.ALL)
@JoinColumn(name = "cardid", referencedColumnName = "cid")
private Card card; public Person() {
} public int getId() {
return this.id;
} public void setId(int id) {
this.id = id;
} public String getAddress() {
return this.address;
} public void setAddress(String address) {
this.address = address;
} public int getAge() {
return this.age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
} public String getPhone() {
return this.phone;
} public void setPhone(String phone) {
this.phone = phone;
} public Card getCard() {
return this.card;
} public void setCard(Card card) {
this.card = card;
}
}
cardBeanpackage huizhi.sessionbean;import huizhi.entity.Card;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;@Stateless
public class Cardbean implements CardbeanLocal { public Cardbean() {
}
@PersistenceContext(unitName="YingShe_PU")protected EntityManager em;
public void delCard(String cid) {
em.remove(em.find(Card.class, cid));
} public Card getCardByCid(String cid) {
return em.find(Card.class, cid);
}
}PersonBeanpackage huizhi.sessionbean;import java.util.Date;
import huizhi.entity.Card;
import huizhi.entity.Person;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;/**
* Session Bean implementation class Personbean
*/
@Stateless
public class Personbean implements PersonbeanLocal { public Personbean() {
// TODO Auto-generated constructor stub
}
@PersistenceContext(unitName="YingShe_PU")protected EntityManager em;
public void addPerson(String name, int age, String phone, String address, String cid, Date valDate) {
Person p = new Person();
Card c = new Card();
c.setCid(cid);
c.setValDate(valDate);
c.setPerson(p);
p.setName(name);
p.setAddress(address);
p.setAge(age);
p.setPhone(phone);
try{
em.persist(c);
p.setCard(c);
} catch(Exception e){
System.out.println("-- 持久化过程中发生异常 --");
System.out.println(e.getMessage());
}
em.persist(p);
} public Person getPersonByCid(String cid) {
Query q = em.createQuery("SELECT p FROM Person p WHERE p.card = ?1");
q.setParameter("1", cid);
return (Person)q.getResultList();
} public void updatePerson(Person pp, String cid) {
Person p = this.getPersonByCid(cid);
p.setName(pp.getName());
p.setAge(pp.getAge());
p.setPhone(pp.getPhone());
p.setAddress(pp.getAddress());
p.getCard().setValDate(pp.getCard().getValDate());
}
}
所以绝不能persist(Person).
只能persist(Card),继而级联添加Person.但Card中的注解并没有设置级联添加:
@OneToOne(cascade={CascadeType.MERGE, CascadeType.REMOVE}, optional = false, mappedBy = "card")
private Person person;应改为:
@OneToOne(cascade=CascadeType.ALL, optional = false, mappedBy = "card")
private Person person;含有外键的一端应该加入unique表示一对一:
@JoinColumn(name = "cardid", referencedColumnName = "cid",unique="true")
private Card card;
另外,不知道你的数据库使用的是哪种?
如果是SQLServer,主键的注解应该是:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)如果是Oracle,主键的注解应该是:
@Id
@SequenceGenerator(name="oid",sequenceName="oid")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="oid")如果是MySQL则可使用AUTO.添加时则不用指定card的主键值,只需要设置其他属性值即可://设置card属性值
//设置person属性值
card.setPerson(person);
person.setCard(card);
em.persist(card);