Java EJB:不是已知的实体类型
我在前面的主题(调试我的东西)中没有发现问题,因此我的问题: Java中的WebApp,使用EJB,使用实体。WebApp通过调用远程接口调用EBJ。接下来,EJB实现使用实体。这是堆栈:Java EJB:不是已知的实体类型,java,web-applications,entity,ejb-3.0,Java,Web Applications,Entity,Ejb 3.0,我在前面的主题(调试我的东西)中没有发现问题,因此我的问题: Java中的WebApp,使用EJB,使用实体。WebApp通过调用远程接口调用EBJ。接下来,EJB实现使用实体。这是堆栈: Caused by: java.lang.IllegalArgumentException: Object: ejbpersistance.entities.User@bfbbebb is not a known entity type. at org.eclipse.persistence.
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>
ejbperstance.entities.User
ejbperstance.entities.Comment
ejbperstance.entities.Article
ejbperstance.entities.User
用户道:
public class UserDao extends DaoAbstract<User, Integer>{
public类UserDao扩展了dao抽象{
}
摘要:
公共类抽象{
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();
}
私有实体管理器工厂emf;
公共EntityManagerFactory getEntityManagerFactory(){
if(emf==null)
emf=Persistence.createEntityManagerFactory(“EJBJPA”);
返回电动势;
}
类实体类;
{
entityClass=(类)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
公共列表getAll(){
emf=getEntityManagerFactory();
EntityManager em=emf.createEntityManager();
em.getTransaction().begin();
List object=em.createQuery(“从“+entityClass.getAnnotation(Entity.class.name()+“obj”中选择obj”)
.getResultList();
em.flush();
em.getTransaction().commit();
em.close();
返回对象;
}
公共C获取(I id){
emf=getEntityManagerFactory();
EntityManager em=emf.createEntityManager();
em.getTransaction().begin();
C object=em.find(entityClass,id);
em.flush();
em.getTransaction().commit();
em.close();
返回对象;
}
公共C保存(C对象){
emf=getEntityManagerFactory();
EntityManager em=emf.createEntityManager();
em.getTransaction().begin();
em.persist(object);
em.flush();
em.getTransaction().commit();
em.close();
返回对象;
}
公共作废删除(C对象){
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();
}
}
少了什么?我不这么认为有什么问题吗?
谢谢大家请显示您的UserDao。这个主题如何?我尝试过这样做,但没有成功。我尝试过@Everv0id的答案,并认识到在wildfly8.2中,尽管我将“排除未列出的类”设置为false,但我仍然需要将实体类逐个添加到persistence.xml中。