我有一个表'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'。
答案 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
我希望这些信息可以帮到你。
祝你好运。