java - 如何使用休眠和 ajax 请求读取表格
问题描述
我有以下代码从我的数据库中检索数据。我在 Wildfly 和 MySQL 服务器上运行。
下面的代码片段应该返回所有可用的用户组。
@WebServlet(urlPatterns = {"/groups_list"})
public class UserGroupList extends HttpServlet {
/**
* Get all users groups available
* @param request
* @param response
* @throws IOException
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
Session session = HibernateHelper.getSessionFactory().openSession();
List<UserGroup> userGroups= session.createQuery("FROM UserGroup UG").getResultList();
ObjectMapper objectMapper = new ObjectMapper();
try {
String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(userGroups);
response.getWriter().println(json);
} catch(Exception e) {
response.getWriter().println(e.getMessage());
}
}
}
下面的代码段应该返回所有可用的用户。
@WebServlet(urlPatterns = {"/users_list"})
public class UsersList extends HttpServlet {
/**
* Get all users available
* @param request
* @param response
* @throws IOException
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
Session session = HibernateHelper.getSessionFactory().openSession();
List<User> users = session.createQuery("FROM User s").getResultList();
ObjectMapper objectMapper = new ObjectMapper();
try {
String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(users);
response.getWriter().println(json);
} catch(Exception e) {
response.getWriter().println(e.getMessage());
}
}
}
ajax 请求发送如下:
$(function() {
// Fetch all user groups
$.ajax({
type: 'GET',
url: 'http://localhost:8080/shopping_cart/groups_list',
dataType:'json',
success: function(data){
},
error: function(data){
toastr.error('Error. Couldn\'t fetch user groups.')
}
});
// Fetch all users
$.ajax({
type: "GET",
url: "http://localhost:8080/shopping_cart/users_list",
dataType: "json",
contentType: "application/json",
success: function(response) {
console.log(response);
},
error: function(data){
toastr.error('Error fetching user goups.')
}
});
});
我的用户实体显示:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="user_id")
private int id;
@Embedded
private Person person;
@Column(columnDefinition = "VARCHAR(255)")
private String image;
@ManyToOne
@JoinColumn(name="user_group_id", nullable = false, referencedColumnName = "user_group_id")
private UserGroup userGroup;
我的用户组实体:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="user_group_id")
private int id;
@NotNull
@Column(nullable = false, columnDefinition = "VARCHAR(20)")
private String name;
@NotNull
@Column(nullable = false, columnDefinition = "TEXT")
private String permission;
@OneToMany(mappedBy="userGroup",
cascade={CascadeType.PERSIST, CascadeType.MERGE},
fetch = FetchType.LAZY)
private List<User> users = new ArrayList<User>();
但是,我可能会使用上面的确切代码并返回表中可用的所有数据,如果数据不存在,我会在浏览器控制台窗口中得到一个空数组作为响应。下次我发送请求时,我得到以下信息:
Infinite recursion (StackOverflowError) (through reference chain: models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]->org.hibernate.collection.internal.PersistentBag[0]->models.User["userGroup"]->models.UserGroup["users"]-
解决方案
原因可能是您并没有真正向客户端返回任何错误,原因是
catch(Exception e) {
e.printStackTrace();
}
此外,如果您打开了 Hibernate 会话,则必须在final
块中将其关闭。
杰克逊在将实体转换为 JSON 过程中无限处理的原因User -> UserGroup -> User
您可以使用其他 Jackson 注释来解决此问题
杰克逊 JSON 和 Hibernate JPA 问题的无限递归
我想建议你改变你的模型:
UserGroup
是表格数据,因此您不必将用户存储在那里。只需将其从UserGroup
private List<User> users = new ArrayList<User>();
推荐阅读
- oauth-2.0 - 如何使用自动刷新令牌授予实现 OAuth2 代码流
- scala - 如何读取 CSV 文件,然后在 Spark Scala 中将其保存为 JSON?
- angular - 如果 CORS 标头“Access-Control-Allow-Origin”为“*”,则不支持凭据
- reactjs - 在未更新的道具更新上渲染组件
- canoe - CAN Busmaster DataField 解码报文
- php - Ajax 在下拉列表中发送相同的值但不同的选项
- ffmpeg - 未找到 MPJPEG 预期边界“--”
- wordpress - 如何在 Wordpress 中上传 webp 图片?
- c# - 如何将控件的属性与 XAML (WPF) 中的某些计算绑定?
- php - 自定义订单在 Woocommerce 中收到返回 URL 查询参数