java - Hibernate 中的反向继承映射

标签 java hibernate orm hibernate-mapping

我有三个表:

域名

|Field   |Type         |
| id     | BIGINT      |
| domain | VARVHAR(45) |
| other  | ...         |

网址

|Field      |Type         |
| id        | BIGINT      |
| domain_id | BIGINT      |
| url       | VARCHAR(45) |
| other     | ...         |

数据

|Field      |Type                  |
| id        | BIGINT               |
| type      | ENUM('DOMAIN','URL') |
| entity_id | BIGINT               |
| data      | ...                  |

其他字段下,女巫包含在网址表中,我了解一些字段,它们之间的类型有所不同。

数据表中的entity_id字段必须包含表网址中的ID,具体取决于值数据表中的类型字段。

如何创建此 xml 映射以供 Hibernate 使用?

最佳答案

就我而言,您最好使用@Inheritence并将Data表与父实体映射,如下所示:

@Entity
@Table(name="MODEL")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="entity_type",discriminatorType=DiscriminatorType.STRING)
public abstract class Model{

@Id
private int id;
//other common attributes
//getters& setters
}

然后是您的 DomainUrl

@Entity
@DiscriminatorValue(value="domain")
public class Domain extends Model{
private String domain;
//getters&setters
}

//

@Entity
@DiscriminatorValue(value="url")
public class Url extends Model{
@ManyToOne
private Domain domain;

private String url;
//getters & setters
}

这将创建一个名为 MODEL 的表,该表将有 2 种类型(DomainUrl)以及一个额外的列( entity_type),根据记录类型,它将采用值“domain”“url”

稍后在您的数据实体中:

@Entity
public class Data{
private int id;
@ManyToOne
private Model model;
}

Ps:当您拥有鉴别器列 entity_type 时,您不再需要在 Data 实体中添加 type 属性

关于java - Hibernate 中的反向继承映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37673288/

相关文章:

java - Hibernate - 获取级联创建中创建的所有实体

java - 如何在 Java Spring 和 Hibernate 的单个事务中管理 2 个 DAO 方法?

php - 是否可以使用反射修改对象实例的方法

java - 在 Spring Faremework 中通过 smtp.gmail 发送电子邮件

java - 空指针异常

java - Windows 上用于测试的本地邮件服务器 (SSL + NTLM)

python - 如何使用 cassandra python-driver 实现基于 token 的分页?

java - 了解hibernate缓存

java - 从 maven 程序集描述符中的 jars 中排除包

java - 即使返回404错误,tomcat是否创建线程