Java 可选带hibernate的多通
我正在尝试使用JavBeans+Hibernate映射创建和开放源代码库,该映射使用提供的数据库来读取值(它只读取,不写入)。遗憾的是,这个数据库设计得不是很好 我的问题是多通关系是可选的,即它可以为空 以下是两个表(第一个是Java 可选带hibernate的多通,java,hibernate,jpa,Java,Hibernate,Jpa,我正在尝试使用JavBeans+Hibernate映射创建和开放源代码库,该映射使用提供的数据库来读取值(它只读取,不写入)。遗憾的是,这个数据库设计得不是很好 我的问题是多通关系是可选的,即它可以为空 以下是两个表(第一个是类型,第二个是元类型): 所以,现在有一个问题,这一切如何属于一起。在types表中有各种类型,比如可以存在的事物列表 在第二个表中,这些内容被分组在一起。如您所见,“野餐表”在元类型表中有一个条目作为类型表的子项 如果类型是基类型,则元类型表中没有相应的条目。在一个设计良
类型
,第二个是元类型
):
所以,现在有一个问题,这一切如何属于一起。在types表中有各种类型,比如可以存在的事物列表
在第二个表中,这些内容被分组在一起。如您所见,“野餐表”在元类型表中有一个条目作为类型表的子项
如果类型是基类型,则元类型表中没有相应的条目。在一个设计良好的数据库中,至少应该存在一个NULL为parentTypeID
的条目,但它不存在。我通过在类型bean中使用@NotFound(action=NotFoundAction.IGNORE)
解决了这个问题
在真实的数据库中,metaType
表中有更多的列包含额外的相关信息,因此我必须有一个metaType
bean
在这冗长的介绍之后,真正的问题出现了:
如何将类型
映射到它的变体(元类型
)?
这就是我所尝试的(缩短,主要使用getter和setter):
那么,这种方法有什么问题?我该如何使其发挥作用呢?好的,以下是我的做法,似乎效果不错:
类型实体
@Entity
public class Type {
@Id
@Column(name = "typeId")
private Integer id;
@Column(name="typeName")
private String name;
@OneToMany
@JoinColumn(name="parentTypeId")
List<MetaType> metaTypes;
}
@Entity
public class MetaType {
@Id
private Integer id;
@MapsId
@OneToOne
@JoinColumn(name = "typeId")
private Type type;
@ManyToOne
@JoinColumn(name = "parentTypeId")
private Type parentType;
}
现在,我恢复了给定的类型,如您给出的示例,并获得了正确的数据:
TypeService service = ...;
Type t = service.getTypeById(2);
System.out.println(t.getName());
for(MetaType mt : t.getMetaTypes()){
System.out.println("\t" + mt.getType().getName() + "-> " + mt.getParentType().getName());
}
这将产生输出
Table
Picnic Table-> Table
Bedside Table-> Table
它也适用于没有变化的类型。如果您查询类型2(椅子),它将带来一个带有空变体集合的椅子,我希望这是您所期望的。谢谢,这几乎正是我所需要的。使用不存在的id是一个非常有趣的技巧;)我最后还添加了Type->MetaType一对一关系,因为我需要能够查询床头柜,获取meta类型,获取它的父级(表),然后列出变体。但由于我已经知道,使用这个解决方案似乎正是我所需要的,我只是测试了它,到目前为止,它工作得很好。
@Entity
public class MetaType {
@Id
private Integer id;
@MapsId
@OneToOne
@JoinColumn(name = "typeId")
private Type type;
@ManyToOne
@JoinColumn(name = "parentTypeId")
private Type parentType;
}
TypeService service = ...;
Type t = service.getTypeById(2);
System.out.println(t.getName());
for(MetaType mt : t.getMetaTypes()){
System.out.println("\t" + mt.getType().getName() + "-> " + mt.getParentType().getName());
}
Table
Picnic Table-> Table
Bedside Table-> Table