我试图找到答案,但不幸的是,没有运气。
数据结构如下所示:
TABLE_X.userId是INTERNAL_USERS.userId或EXTERNAL_USERS.userId。
现在,我想将一个实体映射到TABLE_X之外,并将用户对象映射到正确的实体,INTERNAL_USERS或EXTERNAL_USERS。 我该怎么做?
我应该创建两个字段并将一个字段映射到INTERNAL_USERS和一个两个EXTERNAL_USERS,只看哪一个不为空?
答案 0 :(得分:0)
如果我正确理解了您的问题,您需要做的是使用TABLE_X类的字段复制TABLE_X列的结构,并将其添加到INTERNAL_USERS.userID的一个字段和EXTERNAL_USERS.userID的一个字段
但是如果你在TABLE_X.userType上存储,如果用户是内部的或外部的,我认为你能做的最好的事情就是不创建任何其他表,因为你只需要在第一个表上获得所需的信息(TABLE_X) 。如果你想知道所有内部用户,只需要做一个SQL并选择TABLE_X中的所有值,其中userType ="内部"
答案 1 :(得分:0)
使用Hibernate继承。查看每个类继承模式的表。这里有TABLE_X中的INTERNAL_USERS或EXTERNAL_USERS数据,userType作为鉴别器列。 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1191
答案 2 :(得分:0)
根据表结构,您可以使用JPA继承,详见此处:
https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Example_joined_inheritance_annotations
在Hibernate中,您可以按如下方式对这种关系进行建模。查询用户时,您可以依赖Hibernate返回正确类型的实例。
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class User{
@Id
private Long userId;
}
@Entity
public class InternalUser extends User{
}
@Entity
public class ExternalUser extends User{
}
正如链接到的文章所述,Hibernate在使用联接继承时不需要指定鉴别器列。但是,它确实支持鉴别器列(如果有的话)。由于您的架构中有一个可用 - userType - 然后您可以根据需要明确指定它。我想这会在生成的SQL方面产生一些性能优势:
带有可选鉴别器列的映射:
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="userType")
public class User{
@Id
private Long userId;
}
@Entity
@DiscriminatorValue("INT")
public class InternalUser extends User{
}
@Entity
@DiscriminatorValue("EXT")
public class ExternalUser extends User{
}