Hibernate:@ManyToOne通过自定义查询

时间:2015-08-10 18:14:54

标签: hibernate filtering many-to-one

我有一个表'AnyEntityReference',它通过两个字段引用其他实体:引用的实体'type'(即'Entity1','Entity2',...)和实体'key':

create table AnyEntityReference (
  type       varchar, /* 'Entity1' or 'Entity2' or 'Entity3' */
  key        varchar  /* if type = 'Entity1' then key to 'Entity1' table etc. */
)

create table Entity1 (
  key        varchar,
  ...
)

create table Entity2 (
  key        varchar,
  ...
)

create table Entity3 (
  key        varchar,
  ...
)
...

我需要将这些字段视为许多@ManyToOne声明,如下所示:

@ManyToOne
@JoinColumn(name = "key", insertable=false, updatable=false)
@NotFound(action = NotFoundAction.IGNORE)
private Entity1 entity1;

@ManyToOne
@JoinColumn(name = "key", insertable=false, updatable=false)
@NotFound(action = NotFoundAction.IGNORE)
private Entity2 entity2;

@ManyToOne
@JoinColumn(name = "key", insertable=false, updatable=false)
@NotFound(action = NotFoundAction.IGNORE)
private Entity3 entity3;
...

这里缺少的是一些额外的过滤器,它允许Hibernate仅初始化匹配'type'的一个字段。

我想我可以使用@Where或@Filter注释,但我不知道如何从引用'owner'中引用'type'字段。

另外,我希望以这种方式实现这一点,因此'AnyEntityReference'中的这些字段可能在@OneToMany关系中被引用为'mappedBy'。

3 个答案:

答案 0 :(得分:1)

我修改了您的代码:尝试使用以下代码来纠正您的问题, 如果你想得到正确的解决方案,那么指定表结构。

@ManyToOne
@JoinColumn(name = "KEY", insertable=false, updatable=false)
@NotFound(action = NotFoundAction.IGNORE)
private User user;


@JsonIgnore
@OneToMany(mappedBy="user")
private Set<Organization> Organization;

上面的代码:单个组织有多个与表有关的用户。

答案 1 :(得分:0)

@JoinFormula的效果非常好:

@ManyToOne(fetch=FetchType.LAZY)
@JoinFormula(value="(SELECT u.key FROM Entity1 u WHERE type = 'Entity1' and u.key = key)",
  referencedColumnName="key")
@NotFound(action = NotFoundAction.IGNORE)
private @Nullable Entity1 entity1;

当我尝试使用这些字段作为&#39; mappedBy&#39;时,Hibernate不支持(崩溃)的唯一小问题。在@OneToMany关系中。

答案 2 :(得分:0)

作为一本书的标题&#34; Thinking in Java&#34;,我认为你的问题的最佳解决方案是多态性。像这样的东西:

   @Entity
   @Table("AnyEntityReference")
   public class AnyEntityReference {
      ...
      @JoinColumn(name = "key", insertable=false, updatable=false)
      @NotFound(action = NotFoundAction.IGNORE)
      private Entity entity;
      ...
    }

    // Base class
    @Entity
    @Inheritance(strategy=SINGLE_TABLE)
    public class Entity {
      ...
      @Id
      private String key;
      ...
    }

    //Child Classes
    @Entity
    public class EntityType1 extends Entity {
      ...
    }

    @Entity
    public class EntityType2 extends Entity {
      ...
    }

    @Entity   
    public class EntityType3 extends Entity {
      ...
    }

通过这种方式,您只需要实体(基类)的引用,并且可以使用多态来处理每个对象。

我与您分享了一些关于此的链接。

  

https://docs.oracle.com/html/E13981_01/cmp30cfg016.htm   https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/inheritance.html

我希望这些信息可以帮到你。

祝你好运。