[英]JPA One entity for Two Tables without SecondaryTable
我描述了一些由文件夾和文檔組成的 ECM 域 model。 簡單來說,文件夾可以包含文檔和其他文件夾(子文件夾)。 文件夾和文檔都有屬性。 屬性可以是不同的類型。
在OOP中,這個model由下圖描述
而我需要把map這個結構放到數據庫表中。
當我嘗試將 map Attr
實體添加到數據庫中的表時,我的問題就出現了。 Attr
與Document
和Folder
實體具有多對一的關系。 這意味着表ATTR
必須有兩個外鍵: DOCUMENT_FK
和FOLDER_FK
分別。
因此ER圖看起來像這樣
以及對應的JPA映射:
package ru.max.db.folders.domain
import javax.persistence.*
@Entity
@Table(name = "ATTR_TYPE")
class AttrType(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long,
val name: String
)
@Entity
@Table(name = "ATTR")
class Attr(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long,
@ManyToOne
@JoinColumn(name = "TYPE")
val type: AttrType,
val value: String
)
@Entity
@Table(name = "DOCUMENT")
class Document(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long,
val type: String,
@ManyToOne
@JoinColumn(name = "PARENT_FOLDER")
val parentFolder: Folder,
@OneToMany
@JoinColumn(name = "DOCUMENT_ID")
val attrs: MutableList<Attr>?
)
@Entity
@Table(name = "FOLDER")
class Folder(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long,
val clazz: String,
@OneToMany
@JoinColumn(name = "FOLDER_ID")
val attrs: MutableList<Attr>?,
@OneToMany
@JoinColumn(name = "PARENT_FOLDER")
val subFolders: MutableList<Folder>?,
@OneToMany
@JoinColumn(name = "PARENT_FOLDER")
val documents: MutableList<Document>?
)
此解決方案的問題在於ATTR.FOLDER_ID
和ATTR.DOCUMENT_ID
外鍵列必須可以為空,並且某些行將指向文件夾的屬性,而另一行將指向文檔的屬性。 這對我來說看起來不太好。
我想要的是將ATTR
拆分為兩個不同的表FOLDER_ATTR
和DOCUMENT_ATTR
。 這是對應的ER圖:
但是FOLDER_ATTR
與DOCUMENT_ATTR
具有相同的結構。 因此它可以用一個 JPA 實體來表示。 但是我怎么能用 JPA 注釋(或者,也許 with.xml)來描述這個映射?
當然我不能在Attr
實體上使用兩個@Table
注釋:
@Entity
@Table(name = "DOCUMENT_ATTR")
@Table(name = "FOLDER_ATTR")
class Attr(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long,
@ManyToOne
@JoinColumn(name = "TYPE")
val type: AttrType,
val value: String
)
@Entity
@Table(name = "DOCUMENT")
class Document(
...
@OneToMany
@JoinColumn(name = "OBJECT_ID")
val attrs: MutableList<Attr>?
)
@Entity
@Table(name = "FOLDER")
class Folder(
...
@OneToMany
@JoinColumn(name = "OBJECT_ID")
val attrs: MutableList<Attr>?,
...
)
有可能以某種方式在這里實現我想要的嗎? 我不想讓兩個不同的類代表相同的結構,只是為了適應數據庫 model。
您可以保持 object model 原樣,而不是在 ATTR 表上使用兩個外鍵,您可以使用兩個連接表(DOCUMENT_ATTR,FOLDER_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>?,
...
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.