使用Jersey的JAX-RS的hibernate资源类中的多对一连接表

使用Jersey的JAX-RS的hibernate资源类中的多对一连接表,hibernate,rest,jersey,hql,Hibernate,Rest,Jersey,Hql,我正在使用Jersey实现一个RESTful Web服务。我使用hibernate与数据库(mySQL)通信。我的hibernate资源类包括: @Entity public class Activity { @Id @GeneratedValue private long id; @ManyToOne @JoinTable(name="category_activity", joinColumns={@JoinColumn(name="activit

我正在使用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;
}
以及类别类别:

@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;
}
JSON格式的结果不正确,如下所示:

[[{"id":26,"key":"other","name":"Other","cost":100.0,"category":{"id":10,"name":"General","description":""}},{"id":10,"name":"General","description":""}]]
正如你们所看到的,分类打印了两次,我们在它周围有一个额外的[]。 当我在类别类中使用一对多关系的另一种机制时,如:

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

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":""}}]

非常感谢您的帮助。

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

双向关联始终有一个所有者端(在其中指定要使用的联接列或联接表),以及一个反向端,该反向端通过使用mappedBy属性表示它是另一端的反向:

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;
}

@JBNizet我很好奇,如果你不使用
mappedBy
属性会发生什么?到目前为止我还没有使用它,但现在我在Jax-rs上遇到了问题。使用某些注释不会影响某些不同的事情吗?它会创建两个关联,而不是一个。因此,在同一事务中将A与B和B与A关联将让Hibernate问题2插入查询而不是一个。还会有其他“惊喜”。这是错误的。尽管如此,我怀疑它与Jax RS有任何关系,因为Jax RS不关心POJO的持久化方式。
[{"id":26,"key":"other","name":"Other","cost":100.0,"category":{"id":10,"name":"General","description":""}}]
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 a from Activity as a where a.category.id= :categoryId order by a.key