【问题标题】:REST webservice object mismatching Hibernate relationship (passing id instead the object)REST webservice 对象不匹配 Hibernate 关系(传递 id 而不是对象)
【发布时间】:2017-03-09 16:38:54
【问题描述】:

我有以下模型类:

public class Users implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "iduser")
    private Integer idUser;

    @Basic(optional = false)
    @Column(name = "passwd")
    private String passwd;

    @JoinColumn(name = "idusersgroup", referencedColumnName = "idusersgroup")
    @ManyToOne(optional = true)
    private UsersGroups idUsersGroup;
    .
    .
    .
}

public class UsersGroups implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idusersgroup")
    private Integer idUsersGroup;

    @Basic(optional = false)
    @Column(name = "description")
    private String description;
    .
    .
    .
}

所以我写了一个访问Users数据的服务:

@POST
@Consumes("application/json")
public Response createUser(Users user) {
    Users login;
    UsersDAO u = new UsersDAO();

    if(user.getLogin() == null || user.getDescription() == null || 
            user.getNif() == null || user.getPasswd() == null)
        return Response.status(Response.Status.BAD_REQUEST).entity("Missing information").build();
    try{
        u.addUser(user);
    }catch(HibernateException e){
        return Response.status(Response.Status.BAD_REQUEST).entity("User already exists").build();
    }
    return Response.status(Response.Status.CREATED).build();
}

问题是我不想将关系的参数作为 JSON 中的对象传递,而只是传递它的 id。像这样的:

{
    "login": "admin2",
    "passwd": "12345",
    "idusersgroup": 1
}

但是通过这个实现,idUsersGroup 应该是UsersGroup 的一个实例,而不是它的 id。 实现这一目标的最佳方法是什么?改变关系在模型类中的实现方式?更改 JSON 对象的格式以将 idUsersGroup 呈现为嵌套对象?还有其他选择吗?我是 hibernate 的新手,仍然理解在每种情况下应该如何定义关系

【问题讨论】:

    标签: hibernate rest jersey jax-rs


    【解决方案1】:

    使用 JPA/Hibernate,我们需要自己处理关系。所以基本上你需要做的是查找UserGroup(无论如何查找),然后在User 上设置UserGroup。这将允许UserGroup id 与User 保持一致

    UserGroupDao ugDao = new UserGroupDao();
    UserGroup uGroup = ugDao.findOne(user.getIdusersgroup());
    user.setIdUsersGroup(uGroup);
    u.addUser(user);
    

    【讨论】:

    • 谢谢,我想有了这个我应该能够解决呼叫的休眠方面。问题出在 JSON 中。如果服务使用 JSON 并且我定义为 Users bean,则此 bean 期望接收 UsersGroup 对象,但它接收的是 int,因此 user.getIdUsersGroup() 始终返回 null。我是否应该放弃使用 bean 并直接解析为 JSON 对象来获取此 ID 的想法?或者有什么解决方法可以在不编写更多代码的情况下实现这一目标?我想过在 url 中传递这个 id,但这对我来说似乎不是一个非常优雅的解决方案
    • 一般有关系,在URL中也有一些关系的指示。例如usersgroup/1/users。使用此 URL,可以从 URL 中提取 1。 URL 有一些语义。例如,前面的 URL 表示 “属于 id 为 1 的用户组的用户”。因此,如果您向该 URL 发帖,则表示您想为该用户组创建一个用户。
    • 另一方面,如果用户已经存在,您就不想创建新用户。您要做的就是连接用户和使用组。有不同的处理方法。有些人可能只是将用户的 URL(或 ID)发送到用户组 URL,然后您可以根据该信息建立连接。
    • 除此之外(如果你想坚持你正在做的事情),就用户ID而言,只需更改JSON中的属性名称,这样它就不会干扰用户组属性
    • 再次感谢,如果我更改 JSON 中的属性名称,我想我应该在模型类中添加一个具有相同名称和类型的 @Transient 注释字段。没关系吗?我正在尝试这个实现,但我无法让它工作
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多