EJB: Не е известен тип обект

Не намерих проблема в предишна тема (нещо ми отстранява грешки), така че моят проблем: WebApp в Java, използвайки EJB, използвайки Entities. WebApp извиква EBJ чрез извикване на отдалечения интерфейс. След това реализацията на EJB използва обекта. Това е стекът:

    Caused by: java.lang.IllegalArgumentException: Object: ejbpersistance.entities.User@bfbbebb is not a known entity type.
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4228)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:496)
    at ejbpersistance.dao.DaoAbstract.save(DaoAbstract.java:54)
    at ejbimpl.ejb.UserBean.createUser(UserBean.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:55)
    at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
    at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:205)
    ... 48 more

Субектът:

package ejbpersistance.entities;

import javax.persistence.*;

@Entity(name = "user")
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name="email", unique = true, nullable = false)
    private String email;

    @Column(name="password", unique = false, nullable = false)
    private String password;

    @Column(name="subscriber", unique = false, nullable = false)
    private Boolean subscriber;

    public User(){


    }

    public User(String email, String password) {
        this.email = email;
        this.password = password;
    }

    public int getId() {
        return id;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Boolean getSubscriber() {
        return subscriber;
    }
}

Реализация на EJB:

    @Override
    public boolean createUser(String mail, String password) {

        UserDao userdao = new UserDao();

        User user = new User();
        user.setEmail(mail);
        user.setPassword(password);

        userdao.save(user);

        return true;
    }

Persistence.xml:

    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <persistence-unit name="ejb-jpa">
        <class>ejbpersistance.entities.User</class>
        <class>ejbpersistance.entities.Comment</class>
        <class>ejbpersistance.entities.Article</class>
        <class>ejbpersistance.entities.User</class>
        <properties>
            <property  name="javax.persistence.jdbc.url"  value="jdbc:mysql://localhost:3306/ejb"/>
            <property  name="javax.persistence.jdbc.user"  value="root"/>
            <property  name="javax.persistence.jdbc.password"  value="root"/>
            <property  name="javax.persistence.jdbc.driver"  value="com.mysql.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

UserDAO:

public class UserDao extends DaoAbstract<User, Integer>{

}

DaoАбстракт:

публичен клас DaoAbstract {

private EntityManagerFactory emf;

public EntityManagerFactory getEntityManagerFactory() {
    if(emf == null)
        emf = Persistence.createEntityManagerFactory("ejb-jpa");
    return emf;
}

Class<C> entityClass;

{
    entityClass = (Class<C>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

public List<C> getAll() {
    emf = getEntityManagerFactory();
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    List<C> object = em.createQuery("SELECT obj FROM " + entityClass.getAnnotation(Entity.class).name() + " obj")
            .getResultList();
    em.flush();
    em.getTransaction().commit();
    em.close();
    return object;
}

public C get(I id) {
    emf = getEntityManagerFactory();
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    C object = em.find(entityClass, id);
    em.flush();
    em.getTransaction().commit();
    em.close();
    return object;
}

public C save(C object) {
    emf = getEntityManagerFactory();
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    em.persist(object);
    em.flush();
    em.getTransaction().commit();
    em.close();
    return object;
}

public void delete(C object) {
    emf = getEntityManagerFactory();
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    em.remove(em.contains(object) ? object : em.merge(object));
    em.flush();
    em.getTransaction().commit();
    em.close();
}

}

Нещо липсва? Мисля, че не, какъв е проблемът? Благодаря на всички ви


person Buzz2Buzz    schedule 22.02.2015    source източник
comment
Моля, покажете вашето UserDao.   -  person Everv0id    schedule 22.02.2015
comment
Какво ще кажете за тази тема stackoverflow.com/questions/19454725/?   -  person Everv0id    schedule 22.02.2015
comment
Опитах се да го направя по този начин, не се получи   -  person Buzz2Buzz    schedule 22.02.2015
comment
Опитах отговора на @Everv0id и разбрах, че в wildfly8.2 в моя случай, въпреки че имам exclude-unlisted-classes, зададени на false, все още трябва да добавя класовете обекти към persistence.xml един по един.   -  person Galilo Galilo    schedule 04.04.2021