簡體   English   中英

JPA 一個實體用於兩個表,沒有SecondaryTable

[英]JPA One entity for Two Tables without SecondaryTable

我描述了一些由文件夾和文檔組成的 ECM 域 model。 簡單來說,文件夾可以包含文檔和其他文件夾(子文件夾)。 文件夾和文檔都有屬性。 屬性可以是不同的類型。

在OOP中,這個model由下圖描述

而我需要把map這個結構放到數據庫表中。

當我嘗試將 map Attr實體添加到數據庫中的表時,我的問題就出現了。 AttrDocumentFolder實體具有多對一的關系。 這意味着表ATTR必須有兩個外鍵: DOCUMENT_FKFOLDER_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_IDATTR.DOCUMENT_ID外鍵列必須可以為空,並且某些行將指向文件夾的屬性,而另一行將指向文檔的屬性。 這對我來說看起來不太好。

我想要的是將ATTR拆分為兩個不同的表FOLDER_ATTRDOCUMENT_ATTR 是對應的ER圖:

但是FOLDER_ATTRDOCUMENT_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM