后台报错信息: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);
}

解决方案 »

  1.   

    像是级联保存的问题。
      Card c = new Card();
            c.setCid(cid);先保存c.试试;
      em.persist(c);
      em.persist(p);
      

  2.   


    就是改成先对 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 
      

  3.   

    huizhi.entity.Card类中没有定义关于cid属性的get方法.
      

  4.   

    @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);        em.persist(c);        p.setCard(c);
            em.persist(p);
        }
    这样试试呢
      

  5.   


    你好,我这个实体类定义getcid方法了。是在em.persist(p)的时候报的,不能持久化card异常,card表和person表是双向一对一映射的。
      

  6.   


    按你这方法也不行,页面抛出的异常信息是:javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction
      

  7.   


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

    }
      

  8.   

    下面的会话bean
    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());
    }
    }
      

  9.   

    Card一端没有外键,外键在Person一端。
    所以绝不能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);