Java 带有依赖注入的JPA控制器
我有以下课程 数据库实体beanJava 带有依赖注入的JPA控制器,java,jpa,dependency-injection,Java,Jpa,Dependency Injection,我有以下课程 数据库实体bean @Entity @Table(name = "tb_clientes") @XmlRootElement @NamedQueries({ @NamedQuery(name = "TbClientes.findAll", query = "SELECT t FROM TbClientes t"), @NamedQuery(name = "TbClientes.findById", query = "SELECT t FROM TbClientes
@Entity
@Table(name = "tb_clientes")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "TbClientes.findAll", query = "SELECT t FROM TbClientes t"),
@NamedQuery(name = "TbClientes.findById", query = "SELECT t FROM TbClientes t WHERE t.id = :id"),
@NamedQuery(name = "TbClientes.findByNomeCliente", query = "SELECT t FROM TbClientes t WHERE t.nomeCliente = :nomeCliente"),
@NamedQuery(name = "TbClientes.findByTelefone1", query = "SELECT t FROM TbClientes t WHERE t.telefone1 = :telefone1"),
@NamedQuery(name = "TbClientes.findByTelefone2", query = "SELECT t FROM TbClientes t WHERE t.telefone2 = :telefone2"),
@NamedQuery(name = "TbClientes.findByTelefone3", query = "SELECT t FROM TbClientes t WHERE t.telefone3 = :telefone3"),
@NamedQuery(name = "TbClientes.findByEmail1", query = "SELECT t FROM TbClientes t WHERE t.email1 = :email1"),
@NamedQuery(name = "TbClientes.findByEmail2", query = "SELECT t FROM TbClientes t WHERE t.email2 = :email2"),
@NamedQuery(name = "TbClientes.findByContato", query = "SELECT t FROM TbClientes t WHERE t.contato = :contato"),
@NamedQuery(name = "TbClientes.findByObs", query = "SELECT t FROM TbClientes t WHERE t.obs = :obs")})
public class TbClientes implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = "NomeCliente")
private String nomeCliente;
@Size(max = 15)
@Column(name = "Telefone1")
private String telefone1;
@Size(max = 15)
@Column(name = "Telefone2")
private String telefone2;
@Size(max = 15)
@Column(name = "Telefone3")
private String telefone3;
@Size(max = 100)
@Column(name = "Email1")
private String email1;
@Size(max = 100)
@Column(name = "Email2")
private String email2;
@Size(max = 100)
@Column(name = "Contato")
private String contato;
@Size(max = 200)
@Column(name = "Obs")
private String obs;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idCliente")
private Collection<TbLogemail> tbLogemailCollection;
public TbClientes() {
}
public TbClientes(Integer id) {
this.id = id;
}
public TbClientes(Integer id, String nomeCliente) {
this.id = id;
this.nomeCliente = nomeCliente;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNomeCliente() {
return nomeCliente;
}
public void setNomeCliente(String nomeCliente) {
this.nomeCliente = nomeCliente;
}
public String getTelefone1() {
return telefone1;
}
public void setTelefone1(String telefone1) {
this.telefone1 = telefone1;
}
public String getTelefone2() {
return telefone2;
}
public void setTelefone2(String telefone2) {
this.telefone2 = telefone2;
}
public String getTelefone3() {
return telefone3;
}
public void setTelefone3(String telefone3) {
this.telefone3 = telefone3;
}
public String getEmail1() {
return email1;
}
public void setEmail1(String email1) {
this.email1 = email1;
}
public String getEmail2() {
return email2;
}
public void setEmail2(String email2) {
this.email2 = email2;
}
public String getContato() {
return contato;
}
public void setContato(String contato) {
this.contato = contato;
}
public String getObs() {
return obs;
}
public void setObs(String obs) {
this.obs = obs;
}
@XmlTransient
public Collection<TbLogemail> getTbLogemailCollection() {
return tbLogemailCollection;
}
public void setTbLogemailCollection(Collection<TbLogemail> tbLogemailCollection) {
this.tbLogemailCollection = tbLogemailCollection;
}
@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 TbClientes)) {
return false;
}
TbClientes other = (TbClientes) 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 "br.com.capixapao.domain.TbClientes[ id=" + id + " ]";
}
}
但是em变量总是空的
正确的方法是什么?当您谈论控制器时,我假设您正在运行某个J2EE应用程序,因为这些应用程序是在支持J2EE的某个应用程序容器中执行的 我认为处理或支持您的需求的最佳方法是创建一个调用服务层的控制器类,该服务层在需要时使用DAO类或有时称为repository类来检索数据 现在,如何将EntityManager注入到这些实例中,我认为您应该阅读一些关于容器管理的EntityManager的内容,这些内容允许您通过依赖注入或JNDI获取对EM的引用。您可以在DAO类中使用
@PersistenceContext
,这将允许容器管理持久性上下文生命周期,并为您提供一个EntityManager实例,您可以使用它来获取数据
在控制器中使用@PersistenceContext
,我认为这不是在应用程序的体系结构和层中进行思考的好方法。当您使用容器时,最好让它们管理生命周期,因此使用EnityManagerFactory可以让您以名为Application managed EM的方式对EM负责
我的建议是这样做
public class UserDAO{
@PersistenceContext
private EntityManager em;
}
你的建议和我的解决方案(问题的最后一段)的想法是一样的。我尝试了@PersistenceContext(nameUnit=“namepersistence”),但我的EntityManager变量始终为空。META-INF中是否有persistence.xml文件,您选择的提供程序是否有jar文件?您需要有某种配置和jar文件,以使其工作,而不仅仅是classesYes。我的META-INF中有persistence.xml。所有配置都很好。
@PersistenceContext(unitName="xxxxx")
EntityManager em;
public class UserDAO{
@PersistenceContext
private EntityManager em;
}