【问题标题】:Can't persist my objects无法持久化我的对象
【发布时间】:2013-05-12 11:32:03
【问题描述】:

这就是问题所在

我有一个 java 类 Agence,它与我的类 Reseau 有 @ManytoOne 关系。

这是我的代理代码:

package ma.kafil.bank;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;


@Entity
public class Agence implements Serializable{

    private int idAgence;
    private String labelle;
    private Reseau reseau;

    public Agence(String labelle) {
    this.labelle = labelle;
    }



    public Agence() {
    }

    @ManyToOne
    public Reseau getReseau() {
    return reseau;
    }

    public void setReseau(Reseau reseau) {
    this.reseau = reseau;
    }



    @Id
    @GeneratedValue
    public int getIdAgence() {
    return idAgence;
    }

    public void setIdAgence(int idAgence) {
    this.idAgence = idAgence;
    }

    public String getLabelle() {
    return labelle;
    }

    public void setLabelle(String labelle) {
    this.labelle = labelle;
    }



}

还有我的 Reseau 课程:

    package ma.kafil.bank;

    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Collection;
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;


    @Entity
    public class Reseau implements Serializable{
        private int idReseau;
        private String Libelle;
        private ArrayList<Agence> Agences = new ArrayList();

        //Constructor without arguments
        public Reseau() {
        }

        public Reseau(String Libelle) {
        this.Libelle = Libelle;
        }

        public void ajouterAgence(Agence a){
        Agences.add(a);
        }


        @Id
        @GeneratedValue
        public int getIdReseau() {
        return idReseau;
        }

        public void setIdReseau(int idReseau) {
        this.idReseau = idReseau;
        }

        public String getLibelle() {
        return Libelle;
        }

        public void setLibelle(String Libelle) {
        this.Libelle = Libelle;
        }


      @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE}, mappedBy="reseau")
        public Collection<Agence> getAgences() {
        return Agences;
        }



        public void setAgences(ArrayList<Agence> Agences) {
        this.Agences = Agences;
        }

        public void addAgence(Agence a){
        this.Agences.add(a);
        }





    }

最后是主类:

package ma.kafil.bank;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class Main {
    public static void main(String [] args){
    //Creating Entity Manager 
    //persistence-unit name="test"

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
    EntityManager em = emf.createEntityManager();

    //beginning the transaction
    em.getTransaction().begin();


    //Creating a new Reseau r with  r.labbelle = "Centre" and r.id=1
    Reseau r = new Reseau("Centre");
    r.setIdReseau(1);

    //Creating a new Agence a 
    Agence a = new Agence("Nom Agence");
    a.setIdAgence(2);

    //adding a to my Reseau (What's the problem with that ?? )
    r.addAgence(a);
    em.persist(r);

    a.setIdAgence(1990);
    a.setReseau(r);

    em.persist(a);
    em.getTransaction().commit();

    //closing em and emf 
    em.close();
    emf.close();



    }

}

这是堆栈跟踪:

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: ma.kafil.bank.Reseau
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)
    at ma.kafil.bank.Main.main(Main.java:30)
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: ma.kafil.bank.Reseau
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:79)
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
    at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
    at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:220)
    ... 1 more
Java Result: 1

这里是persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">   <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class> ma.kafil.bank.Agence</class>
    <class> ma.kafil.bank.Reseau</class>

    <properties>
      <property name="hibernate.connection.username" value="root"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.connection.password" value=""/>
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/awbawards"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
       </persistence-unit> </persistence>

提前致谢

【问题讨论】:

  • 请发布堆栈跟踪
  • 请发布persistence.xml,我相信问题出在那儿。我认为没有正确定义名为“test”的持久性单元
  • 我不认为这是问题
  • 我的不好似乎persistence.xml 没问题。我已经看到了问题...您只能保留一个对象,下一个将“脏”的对象将持续存在,并且您必须使用合并(效果相同)。

标签: java hibernate jpa


【解决方案1】:

在你的 reseau 类中,代理列表永远不会被初始化,它应该是:

    @Entity
    public class Reseau implements Serializable{
        private int idReseau;
        private String Libelle;
        private List<Agence> Agences = new ArrayList<Agence>();

此外,您的字段、getter 和 setter 声明都应使用 List 类型,而不是 Collection 而不是 ArrayList,并且您的字段不应以大写字母开头(java 命名约定):

    private List<Agence> agences = new ArrayList<Agence>();

    public List<Agence> getAgences() {
      return agences;
    }

    public void setAgences(List<Agence> agences) {
      this.agences = agences;
    }

【讨论】:

  • 但是我得到了这个:`线程“main”中的异常javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:分离的实体传递给persist:ma.kafil.bank.Reseau at org.hibernate .ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637) 在 org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226) 在 ma.kafil.bank.Main.main(Main.java:30)`跨度>
  • 这是另一个问题,但他的解决方案是您需要通过您现在得到的NPE。尝试删除任何 a.setIdAgence(...); 行,看看它是否给你新的异常
  • 为什么我应该使用ArrayList而不是collection和ArrayList
【解决方案2】:

问题是当您执行r.addAgence(a); 时,Agences 的列表可能对于少数Reseau 为空。可以在您的 add 方法中进行快速修复 -

public void addAgence(Agence a){
   if(Agences==null){//do this check to avoid null pointer
      Agences = new ArrayList<Agence>();
   }
   this.Agences.add(a);
}

【讨论】:

  • 我仍然有这个问题:分离实体传递给坚持:ma.kafil.bank.Reseau
  • 这是一个不同的问题,与您之前的空指针异常无关。
  • 查看此链接以了解分离实体持久性问题 - stackoverflow.com/questions/6378526/…
【解决方案3】:

既然你编辑了你的问题,我会把它作为答案发布。

根据此回复https://stackoverflow.com/a/2442036/1094430,如果您的数据库设置为自动生成 ID,则不应通过代码设置您的 ID。

所以删除

r.setIdReseau(1);
...
a.setIdAgence(2);
...
a.setIdAgence(1990);

从您的代码中,然后执行持久化。

【讨论】:

  • Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException 在 org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637) 调用 ma.kafil.bank.Reseau.agences 的设置器时发生org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226) 在 ma.kafil.bank.Main.main(Main.java:29)
  • @Kafil10 您的 getter 和 setter 不正确,请参阅我的更新答案
【解决方案4】:

试试这个主要的:

package ma.kafil.bank;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class Main {
    public static void main(String [] args){
    //Creating Entity Manager 
    //persistence-unit name="test"

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
    EntityManager em = emf.createEntityManager();

    //beginning the transaction
    em.getTransaction().begin();


    //Creating a new Reseau r with  r.labbelle = "Centre" and r.id=1
    Reseau r = new Reseau("Centre");
    r.setIdReseau(1);

    //Creating a new Agence a 
    Agence a = new Agence("Nom Agence");
    a.setIdAgence(2);
    a.setIdAgence(1990);
    a.setReseau(r);    

    //adding a to my Reseau (What's the problem with that ?? )
    r.addAgence(a);
    em.persist(r);

    em.getTransaction().commit();

    //closing em and emf 
    em.close();
    emf.close();



    }

}

它应该可以工作,因为两个对象都是链接的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2015-10-21
    • 2018-01-21
    相关资源
    最近更新 更多