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 JPA用于两个表的一个实体,不带SecondaryTable_Java_Hibernate_Kotlin_Jpa - Fatal编程技术网

Java JPA用于两个表的一个实体,不带SecondaryTable

Java JPA用于两个表的一个实体,不带SecondaryTable,java,hibernate,kotlin,jpa,Java,Hibernate,Kotlin,Jpa,我描述了一些包含文件夹和文档的ECM域模型。 简单地说,文件夹可以包含文档和其他文件夹(子文件夹)。文件夹和文档都有属性。属性可以是不同的类型 在OOP中,该模型由 我需要将这个结构映射到数据库表 当我试图将Attr实体映射到数据库中的表时,问题就出现了。 Attr与文档和文件夹实体有多对一关系。 这意味着表ATTR必须有两个外键:DOCUMENT\u FK和FOLDER\u FK 因此,ER图看起来 和相应的JPA映射: 包ru.max.db.folders.domain 导入javax.p

我描述了一些包含文件夹和文档的ECM域模型。 简单地说,文件夹可以包含文档和其他文件夹(子文件夹)。文件夹和文档都有属性。属性可以是不同的类型

在OOP中,该模型由

我需要将这个结构映射到数据库表

当我试图将
Attr
实体映射到数据库中的表时,问题就出现了。
Attr
文档
文件夹
实体有多对一关系。 这意味着表
ATTR
必须有两个外键:
DOCUMENT\u FK
FOLDER\u FK

因此,ER图看起来

和相应的JPA映射:


包ru.max.db.folders.domain
导入javax.persistence*
@实体
@表(name=“ATTR\u TYPE”)
类属性类型(
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
val id:Long,
val名称:String
)
@实体
@表(name=“ATTR”)
类属性(
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
val id:Long,
@许多酮
@JoinColumn(name=“TYPE”)
val类型:属性类型,
val值:字符串
)
@实体
@表(name=“DOCUMENT”)
类文档(
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
val id:Long,
val类型:String,
@许多酮
@JoinColumn(name=“父文件夹”)
val parentFolder:文件夹,
@独身癖
@JoinColumn(name=“DOCUMENT\u ID”)
val属性:可变列表是对应的ER图:

但是
文件夹\u ATTR
具有与
文档\u ATTR
相同的结构。因此,它可以用一个JPA实体表示。但是我如何用JPA注释(或者可能用.xml)描述此映射

当然我不能在
Attr
实体上使用两个
@Table
注释:


@实体
@表(name=“DOCUMENT\u ATTR”)
@表(name=“FOLDER\u ATTR”)
类属性(
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
val id:Long,
@许多酮
@JoinColumn(name=“TYPE”)
val类型:属性类型,
val值:字符串
)
@实体
@表(name=“DOCUMENT”)
类文档(
...
@独身癖
@JoinColumn(name=“OBJECT\u ID”)
val属性:可变列表?
)
@实体
@表(name=“FOLDER”)
类文件夹(
...
@独身癖
@JoinColumn(name=“OBJECT\u ID”)
val属性:可变列表?,
...
)

有可能以某种方式实现我在这里想要的吗?我不想让两个不同的类代表相同的结构来适应数据库模型。

您可以保持对象模型不变,而不是在ATTR表上使用两个外键,您可以使用两个联接表(DOCUMENT\u ATTR,FOLDER\u ATTR)如果这对你更有意义的话

@Entity
@Table(name = "DOCUMENT")
class Document(
    ...
    @OneToMany
    @JoinColumn(
       name = "DOCUMENT_ATTR",
       joinColumns = @JoinColumn( name="document_id"),
       inverseJoinColumns = @JoinColumn( name="attr_id")
    )
    val attrs: MutableList<Attr>?
)

@Entity
@Table(name = "FOLDER")
class Folder(
    ...
    @OneToMany
    @JoinTable(
       name = "FOLDER_ATTR",
       joinColumns = @JoinColumn( name="folder_id"),
       inverseJoinColumns = @JoinColumn( name="attr_id")
    )
    val attrs: MutableList<Attr>?,
    ...
)
@实体
@表(name=“DOCUMENT”)
类文档(
...
@独身癖
@连接柱(
name=“DOCUMENT\u ATTR”,
joinColumns=@JoinColumn(name=“document\u id”),
inverseJoinColumns=@JoinColumn(name=“attr\u id”)
)
val属性:可变列表?
)
@实体
@表(name=“FOLDER”)
类文件夹(
...
@独身癖
@可接合(
name=“文件夹属性”,
joinColumns=@JoinColumn(name=“folder\u id”),
inverseJoinColumns=@JoinColumn(name=“attr\u id”)
)
val属性:可变列表?,
...
)