Java JPA用于两个表的一个实体,不带SecondaryTable
我描述了一些包含文件夹和文档的ECM域模型。 简单地说,文件夹可以包含文档和其他文件夹(子文件夹)。文件夹和文档都有属性。属性可以是不同的类型 在OOP中,该模型由 我需要将这个结构映射到数据库表 当我试图将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
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属性:可变列表?,
...
)