【问题标题】:Jax-RS - java rest api and hibernateJax-RS - java rest api 和休眠
【发布时间】:2017-11-12 11:04:14
【问题描述】:

我正在尝试使用 rest api 和 hibernate 来做我的第一个 JEE 应用程序。我不知道如何以正确的方式做到这一点。我的意思是我有实体用户

@Entity
@XmlRootElement
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String username;
    private String password;
    private String email;
    private LocalDateTime lastDateOfLogin;
    @OneToMany(fetch=FetchType.LAZY)
    private List<Post> posts = new ArrayList<>();
    @OneToMany(fetch=FetchType.LAZY)
    private List<Comment> comments = new ArrayList<>();
    @OneToMany(fetch=FetchType.LAZY)
    private List<Like> likes = new ArrayList<>();
    @OneToMany(fetch=FetchType.LAZY)
    private List<User> followers = new ArrayList<>();
    @OneToMany(fetch=FetchType.LAZY)
    private List<User> following = new ArrayList<>();

我有 UserResource 方法来获取一个用户

    @GET
    @Path("{id}")
    public User getUser(@PathParam("id") long id)
    {
        return userService.getOne(id);
    }

现在我的问题是,当我试图获得一个用户时,我得到了异常 org.hibernate.LazyInitializationException - 我当然知道为什么,但问题是如何以正确的方式做到这一点。在这个@GET 中,我不需要这个 OneToMany 集合,因为当我想要用户帖子时,我会调用 user/1/posts url,我会收到所有用户帖子。

如何开发此类应用程序?我是否应该从用户实体中删除关系并在需要时仅在用户的数据库帖子中搜索?或者也许有其他解决方案?

【问题讨论】:

    标签: java hibernate rest jax-rs


    【解决方案1】:

    如果该特定端点只对有关用户的基本详细信息感兴趣,并且您的数据库模型与系统中的其他对象没有关联,那么您需要以某种方式阻止序列化过程查看这些属性。

    如果它是您希望始终被忽略的字段,您可以使用@XmlTransient 对其进行注释,但这是在构建时确定的决定,不能在运行时修改。对于需要动态影响序列化步骤的情况,可以看看这两篇文章:

    1. How to Conditionally serialize with JAXB or Jackson
    2. Jacksons JsonViewMOXy's external mapping-files

    另一种选择是修改您的服务以返回该特定视图的类实例,该类实例仅包含您希望编组到输出 XML 中的属性。这可以通过 JPA select new 查询轻松完成,例如:

    SELECT new com.company.app.BasicUser(u.userName, other attributes) FROM User u
     WHERE u.id = :id 
    

    现在您的 XML 编组将基于 BasicUser 而不是您的域实体 User,其中 BasicUser 没有任何您不希望为该特定序列化的关联或属性查看。

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2015-02-03
      • 1970-01-01
      相关资源
      最近更新 更多