Java Can';我不能坚持我的目标
这就是问题所在Java Can';我不能坚持我的目标,java,hibernate,jpa,Java,Hibernate,Jpa,这就是问题所在 我有一个java类代理,它与我的类研究有@manytone关系 这是我的代理代码: package ma.kafil.bank; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entit
我有一个java类代理,它与我的类研究有
@manytone
关系
这是我的代理代码:
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;
}
}
还有我的研究课:
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);
}
}
以下是堆栈跟踪:
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>
org.hibernate.ejb.HibernatePersistence
马.卡菲尔.银行.代理
马卡菲尔银行研究所
提前感谢在您的reseau类中,代理列表从未初始化,它应该是:
@Entity
public class Reseau implements Serializable{
private int idReseau;
private String Libelle;
private List<Agence> Agences = new ArrayList<Agence>();
@实体
公共类Reseau实现了可序列化{
伊德雷索私人酒店;
私串诽谤;
私有列表代理=新的ArrayList();
此外,字段、getter和setter声明都应该使用类型列表,而不是集合而不是ArrayList,并且字段不应该以大写字母开头(java命名约定):
private List agents=new ArrayList();
公共列表getagents(){
退货代理;
}
公共代理(列表代理){
this.agents=代理;
}
问题在于,当您执行r.addAgence(a);
时,可能会有少数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);
}
公共无效添加代理(代理a){
如果(agents==null){//请执行此检查以避免空指针
代理=新的ArrayList();
}
本.代理.增补(a);
}
既然你编辑了你的问题,我将把它作为答案发布
基于此回复,如果DB设置为自动生成ID,则不应通过代码设置ID
所以移除
r.setIdReseau(1);
...
a.setIdAgence(2);
...
a.setIdAgence(1990);
从您的代码中,然后执行持久化操作。尝试使用以下主选项:
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();
}
}
它应该可以工作,因为两个对象都是链接的。请发布堆栈跟踪请发布post persistence.xml,我相信这就是问题所在。我认为没有名为“test”的持久化单元定义正确我不认为这是问题所在我的坏消息似乎persistence.xml还可以。我已经看到了问题…你只能持久化一个对象,下一个对象将“脏”持久化,你必须使用merge(效果将是一样的)。但是我得到了这个:`Exception in thread“main”javax.persistence.PersistenceException:org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637)org.hibernate.ejb.AbstractEntityManagerImpl.persistent(AbstractEntityManagerImpl.java:226)上传递给persistent:ma.kafil.bank.Reseau的分离实体在ma.kafil.bank.Main.Main(Main.java:30)`这是另一个问题,但他的解决方案是你现在获得的NPE
所需要的。尝试删除任何a.setIdAgence(…)
行,然后查看它是否给您提供了新的异常为什么我应该使用ArrayList
而不是collection和ArrayList
?我仍然存在这个问题:分离的实体传递到persist:ma.kafil.bank.reseauth这是一个不同的问题,与您以前的空指针异常无关。有关分离实体persist,请参阅此链接ance问题-线程“main”javax.persistence.PersistenceException中的异常:
org.hibernate.PropertyAccessException:IllegalArgumentException在org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException调用ma.kafil.bank.Reseau.agents的setter时发生异常(AbstractEntityManagerImpl.java:637)在ma.kafil.bank.Main.Main(Main.java:29)@Kafil10的org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)上,您的getter和setter不正确,请参阅我更新的答案
r.setIdReseau(1);
...
a.setIdAgence(2);
...
a.setIdAgence(1990);
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();
}
}