Table 每个具体 class 使用 Hibernate OGM 和 mongodb
Table per concrete class with Hibernate OGM and mongodb
我正在使用 mongodb 来存储 json 文档,并且由于我将 Hibernate ORM 用于我的关系模型,所以我决定将 OGM 用于 mongo个。
目前我所有的 OGM 实体共享同一个父实体 class,它看起来像:
@Entity
public abstract class Document {
private static final Gson GSON = new Gson();
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Type(type = "objectid")
protected String id;
public String id() {
return this.id;
}
@Override
public String toString() {
return Document.GSON.toJson(this);
}
}
@Entity
public class Address extends Document {
private String city;
private String street;
private int house;
}
@Entity
public class Person extends Document {
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Address> addresses;
}
(当然是简化版)
当我持久化一个 Person
实例时,我预计会发生的情况是,将在数据库中创建两个集合,一个用于 Person
,另一个用于 Address
,这我推断:
The various inheritance strategies are not supported by Hibernate OGM,
only the table per concrete class strategy is used
(Supported entity mapping - Hibernate OGM documentation)
但实际上只创建了一个名为 Document
的集合,其中包含两个文档:
{
_id : id1,
DTYPE : Person,
name : name of person
}
{
_id : id2,
DTYPE : Address,
city : City of address,
street : Street of address
house : 3
}
我错过了什么?
谢谢
我觉得应该是:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Document {
...
}
我正在使用 mongodb 来存储 json 文档,并且由于我将 Hibernate ORM 用于我的关系模型,所以我决定将 OGM 用于 mongo个。
目前我所有的 OGM 实体共享同一个父实体 class,它看起来像:
@Entity
public abstract class Document {
private static final Gson GSON = new Gson();
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Type(type = "objectid")
protected String id;
public String id() {
return this.id;
}
@Override
public String toString() {
return Document.GSON.toJson(this);
}
}
@Entity
public class Address extends Document {
private String city;
private String street;
private int house;
}
@Entity
public class Person extends Document {
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Address> addresses;
}
(当然是简化版)
当我持久化一个 Person
实例时,我预计会发生的情况是,将在数据库中创建两个集合,一个用于 Person
,另一个用于 Address
,这我推断:
The various inheritance strategies are not supported by Hibernate OGM, only the table per concrete class strategy is used
(Supported entity mapping - Hibernate OGM documentation)
但实际上只创建了一个名为 Document
的集合,其中包含两个文档:
{
_id : id1,
DTYPE : Person,
name : name of person
}
{
_id : id2,
DTYPE : Address,
city : City of address,
street : Street of address
house : 3
}
我错过了什么?
谢谢
我觉得应该是:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Document {
...
}