Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可选带hibernate的多通_Java_Hibernate_Jpa - Fatal编程技术网

Java 可选带hibernate的多通

Java 可选带hibernate的多通,java,hibernate,jpa,Java,Hibernate,Jpa,我正在尝试使用JavBeans+Hibernate映射创建和开放源代码库,该映射使用提供的数据库来读取值(它只读取,不写入)。遗憾的是,这个数据库设计得不是很好 我的问题是多通关系是可选的,即它可以为空 以下是两个表(第一个是类型,第二个是元类型): 所以,现在有一个问题,这一切如何属于一起。在types表中有各种类型,比如可以存在的事物列表 在第二个表中,这些内容被分组在一起。如您所见,“野餐表”在元类型表中有一个条目作为类型表的子项 如果类型是基类型,则元类型表中没有相应的条目。在一个设计良

我正在尝试使用JavBeans+Hibernate映射创建和开放源代码库,该映射使用提供的数据库来读取值(它只读取,不写入)。遗憾的是,这个数据库设计得不是很好

我的问题是多通关系是可选的,即它可以为空

以下是两个表(第一个是
类型
,第二个是
元类型
):

所以,现在有一个问题,这一切如何属于一起。在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