【发布时间】:2018-05-23 13:17:30
【问题描述】:
这个问题What is the right way to use entitymanager 提供了一个指向EntityManagerHelper.java 的链接,我将它添加到我的代码库中。当我使用这个帮助类对数据库进行后续调用时,它会将先前的结果返回到同一个查询。
我最常看到的场景是检索我的 User Class 的 lastentry 属性。在浏览器上,我发出一个 AJAX 请求,下面的部分 servlet 获取用户对象并调用一个方法来返回我的 lastentry。
我已阅读有关 .clear() 的信息,但是当我将它添加到我的 EntityManagerHelper 时出现服务器错误。每次我想调用数据库时,我都想避免创建一个 EntityManager。
我该如何解决这个问题?
部分来自 servlet
User user = User.getUser();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(user.getLastentry());
用户类
package entities;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Persistence;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import org.apache.shiro.SecurityUtils;
import responseablees.EntityManagerHelper;
/**
*
* @author Christopher Loughnane <chrisloughnane1@gmail.com>
*/
@Entity
@Table(name = "user")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
, @NamedQuery(name = "User.findById", query = "SELECT u FROM User u WHERE u.id = :id")
, @NamedQuery(name = "User.findByUsername", query = "SELECT u FROM User u WHERE u.username = :username")
, @NamedQuery(name = "User.getUsernameByUserEmail", query = "SELECT u.username FROM User u WHERE u.useremail = :useremail")
, @NamedQuery(name = "User.findByUserEmail", query = "SELECT u FROM User u WHERE u.useremail = :useremail")
, @NamedQuery(name = "User.findByPassword", query = "SELECT u FROM User u WHERE u.password = :password")})
public class User implements Serializable {
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 2048)
@Column(name = "lastentry")
private String lastentry;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 128)
@Column(name = "useremail")
private String useremail;
@Basic(optional = false)
@Column(name="created", insertable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date created;
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 = "username")
private String username;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = "password")
private String password;
public User() {
}
public User(Integer id) {
this.id = id;
}
public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@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 User)) {
return false;
}
User other = (User) 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 "DAOs.User[ id=" + id + " ]";
}
public String getUseremail() {
return useremail;
}
public void setUseremail(String useremail) {
this.useremail = useremail;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public String getLastentry() {
return lastentry;
}
public void setLastentry(String lastentry) {
this.lastentry = lastentry;
}
public static User getUser(){
String currentUser = (String) SecurityUtils.getSubject().getPrincipal();
User user = (User) em.createNamedQuery("User.findByUserEmail")
.setParameter("useremail", currentUser)
.getSingleResult();
return user;
}
}
请求的代码
详细方法
String currentUser = (String) SecurityUtils.getSubject().getPrincipal();
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("com.mycompany_responseableES_war_1.0-SNAPSHOTPU");
EntityManager em = emfactory.createEntityManager();
User user = (User) em.createNamedQuery("User.findByUserEmail")
.setParameter("useremail", currentUser)
.getSingleResult();
em.getTransaction().begin();
user.setLastentry(JSON);
em.getTransaction().commit();
EntityManagerHelper 方法
User user = User.getUser();
EntityManager em = EntityManagerHelper.getEntityManager();
em.getTransaction().begin();
user.setLastentry(JSON);
em.getTransaction().commit();
【问题讨论】:
-
我想知道你为什么要避免每次都创建一个新的EntityManager?那是因为您不想管理不同的问题案例吗? Personnaly,我被教导为每次使用 EntityManagerFactory 调用数据库创建新的 EntityManager。如果你想做批量请求,是可以做到的。
-
每个设置中我只有两行而不是 6 行,而且我的 createEntityManagerFactory 字符串将只存在于两个地方,即 EntityManagerHelper 类和 JPA 设置
-
是的,我知道与其他技术相比,它做了很多线。你说的那两条线是什么?坚持和提交/关闭?因为现在,我只能看到三个:创建、持久化和提交/关闭。
-
我在我的问题底部添加了代码,这样您就可以看到差异以及为什么它会有利
标签: java entitymanager