获取相关实体作为基本类型

时间:2018-04-10 19:58:56

标签: json jpa

我目前正在尝试设置数据库 - 仅使用Java。鉴于这个简单的类可能出现在普通的社交网络应用程序中:

@Entity
class User {
    @Id
    private String email;
    private String name;
    private String otherInfo;

    @ManyToMany
    private List<User> contacts;
}

当用户登录时,他应该收到基本信息和联系人列表及其基本信息,但不是他们的联系人。为了减少锅炉板代码的数量,我想使用像Gson这样的标准解决方案。但是,即使使用延迟提取,整个用户也会加载到gson.toJson(user)

因此,我考虑将基本信息提取到基类BasicUser并将contacts更改为List<BasicUser>。现在,我只需要在获取联系人时以某种方式绕过鉴别器列 - 当然它们都被保存为服务器上的完整用户。不幸的是,我不知道如何实现这一目标。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果您只需要获得实体的一部分,则可以使用projections。在你的情况下,它可以是,例如,像这样:

public interface BaseUser {
    String getEmail();
    String getName();
    String getOtherInfo();
}

public interface UserRepo extends JpaRepository <User, String> {
    List<BaseUser> findAllBy();
}

答案 1 :(得分:1)

您不必修改域模型只是为了容纳序列化库。

如果您只希望将某个集合的某些字段暴露给JSON,那么您可以将杰克逊与@JsonView一起使用(请参阅此处:How to serialize using @Jsonview with nested objects),不确定Gson是否提供了与我从未有过的类似功能广泛使用它。

答案 2 :(得分:1)

使用Jackson进行序列化,无需编写自定义序列化代码即可解决问题。 BasicUser包含属性的getter,我想序列化:

public interface BasicUser {
    String getEmail();
    String getFirstName();
    String getLastName();
}

使用单个注释,contacts属性被解释为BasicUser的列表:

@Entity
public class User implements BasicUser {    
    @Id
    private String email;
    private String firstName;   
    private String lastName;

    @ManyToMany
    @JsonSerialize(contentAs = BasicUser.class)
    private List<User> contacts = new ArrayList<>();    

    // ... implemented getters
}