当前位置: 首页 > 面试题库 >

使用Jersey的JAX-RS在休眠资源类中使用连接表进行多对一

茅星华
2023-03-14
问题内容

我正在使用Jersey实现RESTful Web服务。我使用hibernate模式与数据库(mySQL)通信。我的hibernate资源类包括:

@Entity
public class Activity {

    @Id
    @GeneratedValue
    private long id;

@ManyToOne
    @JoinTable(name="category_activity",
    joinColumns={@JoinColumn(name="activities_id")},
    inverseJoinColumns={@JoinColumn(name="Category_id")})
    private Category category;
}

和Category类:

@Entity
public class Category {

    @Id
    @GeneratedValue
    private long id;

    @OneToMany
    @Fetch(FetchMode.JOIN)
    @JoinTable(name = "category_activity",
    joinColumns = { @JoinColumn(name = "Category_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "activities_id") })
    @JsonIgnore
    private Collection<Activity> activities;
}

我使用此查询来获取活动:

session.createQuery("from Activity a join a.category cs where cs.id= :categoryId order by a.key").setLong("categoryId", categoryId).list();

JSON格式的结果不正确,例如:

[[{"id":26,"key":"other","name":"Other","cost":100.0,"category":{"id":10,"name":"General","description":""}},{"id":10,"name":"General","description":""}]]

如您所见,类别被打印2次,并且在其周围有一个额外的[]。当我在Category类中使用一对多关系的另一种机制时:

@OneToMany(targetEntity = Activity.class, mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JsonIgnore
private Collection<Project> activities;

在Activity类中:

@ManyToOne(optional = false)
    private Category category;

而这个查询:

session.createQuery("from Activity as a where a.category.id= :categoryId order by a.key").setLong("categoryId", categoryId).list();

一切正常。但是我必须使用联接表,因为我不打算更改数据库。

正确的结果应如下所示:

[{"id":26,"key":"other","name":"Other","cost":100.0,"category":{"id":10,"name":"General","description":""}}]

感谢您的帮助。


问题答案:

在多个方面定义联接表,但不要在一侧再次定义它。这将创建映射到同一表的两个单向关联,而不是一个双向关联。

双向关联始终具有所有者侧(您可以在其中指定要使用的连接列或连接表),以及通过使用mapledBy属性可以说是另一侧的反向的反向侧:

public class Activity {

    @ManyToOne // owner side: it doesn't have mappedBy, and can decide how the association is mapped: with a join table
    @JoinTable(name="category_activity",
               joinColumns={@JoinColumn(name="activities_id")},
               inverseJoinColumns={@JoinColumn(name="Category_id")})
    private Category category;
}

public class Category {
    @OneToMany(mappedBy = "category") // inverse side: it has a mappedBy attribute, and can't decide how the association is mapped, since the other side already decided it.
    @Fetch(FetchMode.JOIN)
    @JsonIgnore
    private Collection<Activity> activities;
}

编辑:

此外,您的查询应仅通过添加select子句来选择活动,而不是查询所连接的所有实体:

select a from Activity as a where a.category.id= :categoryId order by a.key


 类似资料:
  • 问题内容: 我有两个实体:和。我正在使用Hibernate 3.6。 如何使用hibernate标准实现这一目标,最重要的是,我必须将其用于分页。 而“我的道”如下所示以显示jqgrid中的“问题”列表 公共列表showHelpDeskIssues(DetachedCriteria dc,int from,int size){ 问题答案: 您可以尝试以下 这里parent是中的属性名称,child

  • 问题内容: 我想使用联接表在两个表之间建立一对多关系。 最后,我想使用Hibernate批注执行此操作。 我找到了一些使用xml映射执行此操作的示例,但没有带注释的示例。 我相信这就是需要创建表的方式 问题答案: 不要寻找例子。阅读官方文档: 另外,请注意,这是单向一对多关联的默认设置。因此,如果默认的表名和列名适合您,您甚至不必提供注释。

  • 我创建了一个原型为maven archetype webapp的maven项目,然后为了将我的应用程序公开为rest webservice,我正在使用RestEasy,但是在rest应用程序中实现后,我无法访问我创建的URL。请告诉我我做错了什么。感谢您阅读此问题。 我的UserManagementController如下: 我的MyRestWS. java如下: 我的网站。xml如下: 该应用程

  • 问题内容: 我正在开发一个Java脚本客户端应用程序,在服务器端我需要处理CORS,以及我用JERSEY用JAX-RS编写的所有服务。我的代码: 到目前为止,我收到错误消息在请求的资源上没有标头。因此,不允许访问源’ http:// localhost:8080 ‘。” 问题答案: 注意:请务必阅读底部的UPDATE @CrossOriginResourceSharing 是CXF批注,因此不适用

  • 我正在用Jersey实现开发JAX-RS 2.0客户机。REST API返回内容类型为“application/json”的响应;UTF-8' 以前有人有这个问题吗?有什么可能的解决办法??JAX-RS的其他实现是否支持它?