Problemas com o EclipseLink e Netbeans

14 respostas
C

Boa tarde amigos,

estou fazendo um pequeno programa utilizando o EclipseLink JPA. O netbeans gerou para mim as entidades e os controllers, até dado momento tudo bem. O problema foi quando executo, dá stackoverflow. O relacionamento é de um para um. Vou inserir um pedaço do código:

public class ClassList implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "class_name")
    private String className;
    @Basic(optional = false)
    @Column(name = "parent_id")
    private int parentId;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "classList")
    private List<SkillTrees> skillTreesList;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "classList")
    private Lvlupgain lvlupgain;

Ao tentar capturar todas as “classes” do classList, porém já dá stackoverflow

EntityManagerFactory emf = null;
        emf = L2DatabaseFactory.getInstance().getEntityManagerFactory();
        ClassListJpaController jpa = new ClassListJpaController(null, emf);
        List<ClassList> lista = jpa.findClassListEntities();

Realmente alguém pode me ajudar? Obrigado mais uma vez…

Caio

14 Respostas

Hebert_Coelho

Teria como você colocar o código que inseri os dados?

Esse erro de stackOverflow eh quando um método chama outro ou ele mesmo uma pá de vezes, sem ter nenhum controle para parar.

C

Amigo, eu não insiro dados… só faço leitura… mas está aqui o código que o chama:

SkillTreeTable.java
  public void loadDataSkills() {
        SkillClassTable.getInstance().loadData();

O loadData() é o supracitado…

EDIT:
Depurando pelo netbeans descobri que dá o erro nessa linha: List lista = jpa.findClassListEntities();

Caio

Hebert_Coelho

Teria como você colocar o erro, nele deve apontar em qual classe acontece esse erro.

C

Cara, agradeço mesmo a tua ajuda… estou a uma semana com isso…

Exception in thread "main" java.lang.StackOverflowError
	at java.lang.reflect.Field.getDeclaringClass(Field.java:153)
	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:54)
	at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
	at java.lang.reflect.Field.get(Field.java:372)
	at org.eclipse.persistence.internal.descriptors.InstanceVariableAttributeAccessor.getAttributeValueFromObject(InstanceVariableAttributeAccessor.java:76)
	at org.eclipse.persistence.mappings.DatabaseMapping.getAttributeValueFromObject(DatabaseMapping.java:523)
	at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.buildCloneValue(AbstractDirectMapping.java:230)
	at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.buildClone(AbstractDirectMapping.java:220)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.populateAttributesForClone(ObjectBuilder.java:3285)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.populateAndRegisterObject(UnitOfWorkImpl.java:3622)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:987)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:916)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerExistingObject(UnitOfWorkImpl.java:3877)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerExistingObject(UnitOfWorkImpl.java:3826)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.buildUnitofWorkCloneForPartObject(ObjectReferenceMapping.java:96)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.buildCloneForPartObject(ObjectReferenceMapping.java:70)
	at org.eclipse.persistence.internal.indirection.NoIndirectionPolicy.cloneAttribute(NoIndirectionPolicy.java:76)

Mexo com java faz um tempo já… mas nunca vi esse erro no EclipseLink e nem mostrar direito o erro… da uma lida no meu post acima que eu editei haha… valeu

Caio

Hebert_Coelho

E oq o método: pa.findClassListEntities(); faz?

C

Espero que consigamos resolver isto… =)

Chama esse método
 public List<ClassList> findClassListEntities() {
        return findClassListEntities(true, -1, -1);
    }
que chama este 

    private List<ClassList> findClassListEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(ClassList.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

Não entendo porque fica dando este erro.

EDIT:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.sf.l2j.gameserver.datatables.entities;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 *
 * @author caio
 */
@Entity
@Table(name = "class_list")
@NamedQueries({
    @NamedQuery(name = "ClassList.findAll", query = "SELECT c FROM ClassList c"),
    @NamedQuery(name = "ClassList.findById", query = "SELECT c FROM ClassList c WHERE c.id = :id"),
    @NamedQuery(name = "ClassList.findByClassName", query = "SELECT c FROM ClassList c WHERE c.className = :className"),
    @NamedQuery(name = "ClassList.findByParentId", query = "SELECT c FROM ClassList c WHERE c.parentId = :parentId")})
public class ClassList implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "class_name")
    private String className;
    @Basic(optional = false)
    @Column(name = "parent_id")
    private int parentId;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "classList")
    private List<SkillTrees> skillTreesList;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "classList")
    private Lvlupgain lvlupgain;

    public ClassList() {
    }

    public ClassList(Integer id) {
        this.id = id;
    }

    public ClassList(Integer id, String className, int parentId) {
        this.id = id;
        this.className = className;
        this.parentId = parentId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public int getParentId() {
        return parentId;
    }

    public void setParentId(int parentId) {
        this.parentId = parentId;
    }

    public List<SkillTrees> getSkillTreesList() {
        return skillTreesList;
    }

    public void setSkillTreesList(List<SkillTrees> skillTreesList) {
        this.skillTreesList = skillTreesList;
    }

    public Lvlupgain getLvlupgain() {
        return lvlupgain;
    }

    public void setLvlupgain(Lvlupgain lvlupgain) {
        this.lvlupgain = lvlupgain;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ClassList)) {
            return false;
        }
        ClassList other = (ClassList) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "net.sf.l2j.gameserver.datatables.entities.ClassList[ id=" + id + " ]";
    }
    
}

A Classe ClassList caso você queira olhar.
Caio

Hebert_Coelho

Acho que seu erro pode estar aqui:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "classList") private List<SkillTrees> skillTreesList; @OneToOne(cascade = CascadeType.ALL, mappedBy = "classList") private Lvlupgain lvlupgain;

Rolou um copiar e colar absurdo aqui mappedBy = “classList”!

C

Como te falei, a IDE gerou…o que eu devia inserir para ficar correto? Estou vendo teus tópicos que estão na sua assinatura.
Mas na verdade, a ClassList é referenciada nas duas tabelas.

Caio

Hebert_Coelho

Entou gerou muito errado.

mappedBy = “classList” tem que apontar para o campo da outra classe que mapeia. Vc está apontando 2 campos, de tipos diferentes, para um outro campo qualquer.

Eu to achando que é isso.

Por isso a gente não pode confiar muuuuito em código gerado automaticamente. ^^

C

Bom, eu estou olhando teu tópico aqui das assinaturas. E é apontado a tabela do banco mesmo, e outra creio que uma coluna possa ser referenciada mais de uma vez normal. Tem dois relacionamentos, um é OneToOne e OneToMany… não creio que possa ser problema isso… o que você acha que poderiamos testar?

Caio

Hebert_Coelho

Cara, o q eu to achando é que Lvlupgain ta chamando ClassList que chama Lvlupgain e assim vai.

Coloca todo mundo com LazyLoad, acho que pelo menos para o erro.

C

Cara, vou postar o LvlUpGain:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.sf.l2j.gameserver.datatables.entities;

import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 *
 * @author caio
 */
@Entity
@Table(name = "lvlupgain")
@NamedQueries({
    @NamedQuery(name = "Lvlupgain.findAll", query = "SELECT l FROM Lvlupgain l"),
    @NamedQuery(name = "Lvlupgain.findByClassid", query = "SELECT l FROM Lvlupgain l WHERE l.classid = :classid"),
    @NamedQuery(name = "Lvlupgain.findByDefaulthpbase", query = "SELECT l FROM Lvlupgain l WHERE l.defaulthpbase = :defaulthpbase"),
    @NamedQuery(name = "Lvlupgain.findByDefaulthpadd", query = "SELECT l FROM Lvlupgain l WHERE l.defaulthpadd = :defaulthpadd"),
    @NamedQuery(name = "Lvlupgain.findByDefaulthpmod", query = "SELECT l FROM Lvlupgain l WHERE l.defaulthpmod = :defaulthpmod"),
    @NamedQuery(name = "Lvlupgain.findByDefaultcpbase", query = "SELECT l FROM Lvlupgain l WHERE l.defaultcpbase = :defaultcpbase"),
    @NamedQuery(name = "Lvlupgain.findByDefaultcpadd", query = "SELECT l FROM Lvlupgain l WHERE l.defaultcpadd = :defaultcpadd"),
    @NamedQuery(name = "Lvlupgain.findByDefaultcpmod", query = "SELECT l FROM Lvlupgain l WHERE l.defaultcpmod = :defaultcpmod"),
    @NamedQuery(name = "Lvlupgain.findByDefaultmpbase", query = "SELECT l FROM Lvlupgain l WHERE l.defaultmpbase = :defaultmpbase"),
    @NamedQuery(name = "Lvlupgain.findByDefaultmpadd", query = "SELECT l FROM Lvlupgain l WHERE l.defaultmpadd = :defaultmpadd"),
    @NamedQuery(name = "Lvlupgain.findByDefaultmpmod", query = "SELECT l FROM Lvlupgain l WHERE l.defaultmpmod = :defaultmpmod"),
    @NamedQuery(name = "Lvlupgain.findByClassLvl", query = "SELECT l FROM Lvlupgain l WHERE l.classLvl = :classLvl")})
public class Lvlupgain implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "classid")
    private Integer classid;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Basic(optional = false)
    @Column(name = "defaulthpbase")
    private BigDecimal defaulthpbase;
    @Basic(optional = false)
    @Column(name = "defaulthpadd")
    private BigDecimal defaulthpadd;
    @Basic(optional = false)
    @Column(name = "defaulthpmod")
    private BigDecimal defaulthpmod;
    @Basic(optional = false)
    @Column(name = "defaultcpbase")
    private BigDecimal defaultcpbase;
    @Basic(optional = false)
    @Column(name = "defaultcpadd")
    private BigDecimal defaultcpadd;
    @Basic(optional = false)
    @Column(name = "defaultcpmod")
    private BigDecimal defaultcpmod;
    @Basic(optional = false)
    @Column(name = "defaultmpbase")
    private BigDecimal defaultmpbase;
    @Basic(optional = false)
    @Column(name = "defaultmpadd")
    private BigDecimal defaultmpadd;
    @Basic(optional = false)
    @Column(name = "defaultmpmod")
    private BigDecimal defaultmpmod;
    @Basic(optional = false)
    @Column(name = "class_lvl")
    private int classLvl;
    @JoinColumn(name = "classid", referencedColumnName = "id", insertable = false, updatable = false)
    @OneToOne(optional = false)
    private ClassList classList;

    public Lvlupgain() {
    }

    public Lvlupgain(Integer classid) {
        this.classid = classid;
    }

    public Lvlupgain(Integer classid, BigDecimal defaulthpbase, BigDecimal defaulthpadd, BigDecimal defaulthpmod, BigDecimal defaultcpbase, BigDecimal defaultcpadd, BigDecimal defaultcpmod, BigDecimal defaultmpbase, BigDecimal defaultmpadd, BigDecimal defaultmpmod, int classLvl) {
        this.classid = classid;
        this.defaulthpbase = defaulthpbase;
        this.defaulthpadd = defaulthpadd;
        this.defaulthpmod = defaulthpmod;
        this.defaultcpbase = defaultcpbase;
        this.defaultcpadd = defaultcpadd;
        this.defaultcpmod = defaultcpmod;
        this.defaultmpbase = defaultmpbase;
        this.defaultmpadd = defaultmpadd;
        this.defaultmpmod = defaultmpmod;
        this.classLvl = classLvl;
    }

    public Integer getClassid() {
        return classid;
    }

    public void setClassid(Integer classid) {
        this.classid = classid;
    }

    public BigDecimal getDefaulthpbase() {
        return defaulthpbase;
    }

    public void setDefaulthpbase(BigDecimal defaulthpbase) {
        this.defaulthpbase = defaulthpbase;
    }

    public BigDecimal getDefaulthpadd() {
        return defaulthpadd;
    }

    public void setDefaulthpadd(BigDecimal defaulthpadd) {
        this.defaulthpadd = defaulthpadd;
    }

    public BigDecimal getDefaulthpmod() {
        return defaulthpmod;
    }

    public void setDefaulthpmod(BigDecimal defaulthpmod) {
        this.defaulthpmod = defaulthpmod;
    }

    public BigDecimal getDefaultcpbase() {
        return defaultcpbase;
    }

    public void setDefaultcpbase(BigDecimal defaultcpbase) {
        this.defaultcpbase = defaultcpbase;
    }

    public BigDecimal getDefaultcpadd() {
        return defaultcpadd;
    }

    public void setDefaultcpadd(BigDecimal defaultcpadd) {
        this.defaultcpadd = defaultcpadd;
    }

    public BigDecimal getDefaultcpmod() {
        return defaultcpmod;
    }

    public void setDefaultcpmod(BigDecimal defaultcpmod) {
        this.defaultcpmod = defaultcpmod;
    }

    public BigDecimal getDefaultmpbase() {
        return defaultmpbase;
    }

    public void setDefaultmpbase(BigDecimal defaultmpbase) {
        this.defaultmpbase = defaultmpbase;
    }

    public BigDecimal getDefaultmpadd() {
        return defaultmpadd;
    }

    public void setDefaultmpadd(BigDecimal defaultmpadd) {
        this.defaultmpadd = defaultmpadd;
    }

    public BigDecimal getDefaultmpmod() {
        return defaultmpmod;
    }

    public void setDefaultmpmod(BigDecimal defaultmpmod) {
        this.defaultmpmod = defaultmpmod;
    }

    public int getClassLvl() {
        return classLvl;
    }

    public void setClassLvl(int classLvl) {
        this.classLvl = classLvl;
    }

    public ClassList getClassList() {
        return classList;
    }

    public void setClassList(ClassList classList) {
        this.classList = classList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (classid != null ? classid.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Lvlupgain)) {
            return false;
        }
        Lvlupgain other = (Lvlupgain) object;
        if ((this.classid == null && other.classid != null) || (this.classid != null && !this.classid.equals(other.classid))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "net.sf.l2j.gameserver.datatables.entities.Lvlupgain[ classid=" + classid + " ]";
    }
    
}
Hebert_Coelho

Mano, vai rolar de analisar seu código não. Ta muito grande. Tentar colocar o lazy lá e veja no que dá. Foi mals! =/

C

Relaxa cara, dá preguiça mesmo kkk …

@Basic(fetch = FetchType.LAZY)

Coloquei lazy nas referências nas 3 classes… vamos ver o que vai dar agora…
e mais uma vez MUITO OBRIGADO

Deu erro, aí peguei e joguei só na classList e tenho este erro:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'LVLUPGAIN' in 'field list'
Exception in thread "main" Local Exception Stack: 
Error Code: 1054
Call: SELECT id, class_name, LVLUPGAIN, parent_id, SKILLTREESLIST FROM class_list
Query: ReadAllQuery(referenceClass=ClassList sql="SELECT id, class_name, LVLUPGAIN, parent_id, SKILLTREESLIST FROM class_list")
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'LVLUPGAIN' in 'field list'
Error Code: 1054
Call: SELECT id, class_name, LVLUPGAIN, parent_id, SKILLTREESLIST FROM class_list
Query: ReadAllQuery(referenceClass=ClassList sql="SELECT id, class_name, LVLUPGAIN, parent_id, SKILLTREESLIST FROM class_list")

Caio

Criado 4 de novembro de 2011
Ultima resposta 4 de nov. de 2011
Respostas 14
Participantes 2