Jsf 实体不是已知的实体类型
我尝试用JSF和JavaEE在Java中创建一个简单的JavaEE应用程序 我无法部署以下客户实体:Jsf 实体不是已知的实体类型,jsf,ejb,Jsf,Ejb,我尝试用JSF和JavaEE在Java中创建一个简单的JavaEE应用程序 我无法部署以下客户实体: package ch.uufstellend.onlineshop.model; import java.io.Serializable; import javax.ejb.Stateful; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.I
package ch.uufstellend.onlineshop.model;
import java.io.Serializable;
import javax.ejb.Stateful;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import lombok.Data;
@Entity
@Data
@Table(name = "CUSTOMER")
@NamedQuery(
name = "Customer.findAll",
query = "SELECT c FROM Customer c")
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
private String email;
private String password;
public Customer() {
}
@Override
public String toString() {
return id + "-" + email + "-" + password;
}
}
因为:
严重:部署应用程序[uuf onlineshop ear]时出现异常:
无效的ejb jar[uuf-onlineshop-ejb-1.0-SNAPSHOT.jar]:它包含
零ejb。注:
package ch.uufstellend.onlineshop;
import ch.uufstellend.onlineshop.model.Customer;
import java.io.Serializable;
import javax.annotation.Resource;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import lombok.Getter;
import lombok.Setter;
@Named
@RequestScoped
public class RegisterController implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceUnit
private EntityManagerFactory emf;
@Resource
private UserTransaction ut;
@Inject
@Getter
@Setter
private Customer customer;
public String persist() {
try {
ut.begin();
EntityManager entityManager = emf.createEntityManager();
entityManager.persist(customer); // HERE the error is thrown
ut.commit();
FacesMessage m = new FacesMessage("Succesfully registered!", "Your email was saved under id " + customer.getId());
FacesContext.getCurrentInstance().addMessage("registerForm", m);
} catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException e) {
e.printStackTrace();
FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_WARN, e.getMessage(), e.getCause().getMessage());
FacesContext.getCurrentInstance().addMessage("registerForm", m);
}
return "/register.jsf";
}
}
你知道问题出在哪里吗?你的
@Entity
实体bean很好。不要修改它。将其设置为EJB确实会导致所描述的异常,因为EJB容器围绕类创建了一个代理,而该类又不会被识别为JPA实体
您的名为的托管bean是错误的。它与EJB职责(持久性和事务管理)紧密耦合。将EJB职责拆分为一个真正的无状态会话bean,并让托管bean调用它
@Stateless
public class RegisterService {
@PersistenceContext
private EntityManager entityManager;
public void persist(Customer customer) {
entityManager.persist(customer);
}
}
注意,您不需要手动处理真实EJB中的用户事务。只有Customer
上的@Inject
有点奇怪。我不确定@Data
的作用是什么,但如果它与CDI的@Model
注释具有相同的效果,那么就可以了。否则,请转到下面的第二个链接,以获取具体示例和更多链接
另见:
- 您的
@Entity
实体bean一切正常。不要修改它。将其设置为EJB确实会导致所描述的异常,因为EJB容器围绕类创建了一个代理,而该类又不会被识别为JPA实体
您的名为的托管bean是错误的。它与EJB职责(持久性和事务管理)紧密耦合。将EJB职责拆分为一个真正的无状态会话bean,并让托管bean调用它
@Stateless
public class RegisterService {
@PersistenceContext
private EntityManager entityManager;
public void persist(Customer customer) {
entityManager.persist(customer);
}
}
注意,您不需要手动处理真实EJB中的用户事务。只有Customer
上的@Inject
有点奇怪。我不确定@Data
的作用是什么,但如果它与CDI的@Model
注释具有相同的效果,那么就可以了。否则,请转到下面的第二个链接,以获取具体示例和更多链接
另见: