Java 如何在Hibernate中使用两个表持久化自引用实体?

Java 如何在Hibernate中使用两个表持久化自引用实体?,java,hibernate,relationship,Java,Hibernate,Relationship,我在使用Hibernate时遇到了一个小而奇怪的问题。我有两个表:“SERVICE”&定义两个服务之间关系的SERVICE\u RELATIONSHIP CREATE TABLE TMS.TB_SERVICE ( ID_SERVICE INTEGER NOT NULL, NAME VARCHAR(255), ) CREATE TABLE SERVICE_RELATIONSHIP ( ID_SERVICE INTEGER NOT NULL,

我在使用Hibernate时遇到了一个小而奇怪的问题。我有两个表:“SERVICE”&定义两个服务之间关系的SERVICE\u RELATIONSHIP

CREATE TABLE TMS.TB_SERVICE ( 
    ID_SERVICE  INTEGER NOT NULL,
    NAME        VARCHAR(255),
)


CREATE TABLE SERVICE_RELATIONSHIP ( 
    ID_SERVICE      INTEGER NOT NULL,
    ID_SERVICE_REL  INTEGER NOT NULL,
    RELATIONSHIP    VARCHAR(1)  // Could be 'E' (Exclude) or 'I' (Include)
    )
我使用不同的方法(getInclude和getExclude)来获取服务,这取决于它们之间的关系类型。它们工作得很好,唯一的问题是当我想持久化服务时,正确插入ID\u service和ID\u service\u REL列,而不是插入关系

@Table(name="SERVICE")
public class Service implements Serializable {
    private String name;
    private Integer id;
    private Collection<Service> exclude;
    private Collection<Service> include;
     [..]
    @JoinTable(name = "SERVICE_RELATIONSHIP", 
      joinColumns = {
        @JoinColumn(name="ID_SERVICE", unique = false, updatable = true)
      },
      inverseJoinColumns = {
        @JoinColumn(name="ID_SERVICE_REL")
      }
    )
    @WhereJoinTable(clause = "RELATIONSHIP='E'")
    public Collection<Service> getExclude() {
        return exclude;
    }

    [..] 
    @OneToMany(fetch=FetchType.EAGER)
    @JoinTable(name = "SERVICE_RELATIONSHIP",
      joinColumns = {
        @JoinColumn(name="ID_SERVICE", unique = false, updatable = true)           
      },
      inverseJoinColumns = {
        @JoinColumn(name="ID_SERVICE_REL")
      }
    )
    @WhereJoinTable(clause = "RELATIONSHIP='I'")
    public Collection<Service> getInclude() {
        return include;
    }
}
@Table(name=“SERVICE”)
公共类服务实现可序列化{
私有字符串名称;
私有整数id;
私人收藏除外;
私人收藏包括:;
[..]
@JoinTable(name=“服务关系”,
joinColumns={
@JoinColumn(name=“ID\u SERVICE”,unique=false,updateable=true)
},
反向连接列={
@JoinColumn(name=“ID\u SERVICE\u REL”)
}
)
@其中jointable(子句=“RELATIONSHIP='E'”)
公共集合getExclude(){
返回排除;
}
[..] 
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(name=“服务关系”,
joinColumns={
@JoinColumn(name=“ID\u SERVICE”,unique=false,updateable=true)
},
反向连接列={
@JoinColumn(name=“ID\u SERVICE\u REL”)
}
)
@其中jointable(子句=“RELATIONSHIP='I'”)
公共集合getInclude(){
回报包括;
}
}
有什么想法吗?
提前感谢

@WhereJoinTable
如名称所述,仅在对select子句进行连接时用于Where条件

您有几个选项来实现这一点

  • 将关系映射为类
  • 创建包含表和排除表
  • 就个人而言,我会映射relationship类,但我会将其隐藏在
    服务
    之外,因此使用服务的代码不知道relationship类