【问题标题】:How to read table with hibernate and ajax request如何使用休眠和 ajax 请求读取表
【发布时间】:2020-12-21 11:43:13
【问题描述】:

我有以下代码可以从我的数据库中检索数据。我在 Wildfly 和 MySQL 服务器上运行。

下面的 sn-p 应该返回所有可用的用户组。

@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());
        }
    }
}

下面的 sn-p 应该返回所有可用的用户。

@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"]-

【问题讨论】:

    标签: java mysql ajax hibernate servlets


    【解决方案1】:

    原因可能是你并没有真正向客户端返回任何错误,原因

    catch(Exception e) {
      e.printStackTrace();
    }
    

    此外,如果您打开了 Hibernate 会话,则必须在 final 块中将其关闭。

    Jackson在实体转JSON过程中无限处理User -&gt; UserGroup -&gt; User的原因

    您可以使用额外的 Jackson 注释解决此问题

    Infinite Recursion with Jackson JSON and Hibernate JPA issue

    我想建议你改变你的模型:

    UserGroup 是表格数据,因此您不必在其中存储用户。 只需将其从 UserGroup 中删除即可

    private List<User> users = new ArrayList<User>();
    

    【讨论】:

    • 我已经包含了抛出的异常
    猜你喜欢
    • 2021-06-11
    • 2019-12-10
    • 2013-10-16
    • 1970-01-01
    • 2017-04-13
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    相关资源
    最近更新 更多