2017-09-26 77 views
0

方案:我在我的postgres數據庫中有兩個名爲Document和Element的表。它們之間的關係是一對多的(一個文檔有很多元素)。所以元素表有一個文檔ID的外鍵。現在我需要從每個文檔ID的初始值開始爲元素ID創建一個序列。JPA - 爲每個外鍵生成一個序列標識(非唯一)並創建一個複合鍵

例如:

e_id | d_id 
------------ 
1 | x 
2 | x 
3 | x 
1 | y 
2 | y 
3 | y 

一旦我有這樣,有元件和另一臺之間的一個新的水平關係的所謂的標記元件,其具有複合關鍵字(DOCUMENT_ID,element_id)和labeler_id的複合密鑰。

問題:

  1. 如何生成序列從每個文檔ID的初始值開始?

  2. 如何在標籤表中顯示組合鍵的JPA映射。具體哪個字段我也映射文檔ID?

以下是爲您提供方便(在斯卡拉)型號:

@Embeddable 
class CompositeKey extends Serializable { 

    @BeanProperty 
    @Column(name = "id", nullable = false) 
    var id : Long = _ 

    @BeanProperty 
    @Column(name = "document_id", nullable = false) 
    var documentId : UUID = _ 

    def this(id: Long, documentId: UUID) = { 
    this() 
    this.id = id 
    this.documentId = documentId 
    } 
} 

@Entity 
@DynamicUpdate 
@Table(name = "element") 
class Element { 

    @EmbeddedId 
    @BeanProperty 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    var id: CompositeKey = _ 

    @MapsId("documentId") 
    @BeanProperty 
    @JoinColumn(name = "document_id", referencedColumnName = "id") 
    @ManyToOne(fetch = FetchType.LAZY) 
    var document: Document = _ 

LabeledElement

@Embeddable 
class LabeledElementKey extends Serializable { 
    @BeanProperty 
    @Column(name = "document_id", nullable = false) 
    var documentId : UUID = _ 

    @BeanProperty 
    @Column(name = "labeler_id", nullable = false) 
    var labelerId : Long = _ 

    @BeanProperty 
    @Column(name = "element_id", nullable = false) 
    var elementId : Long = _ 

    def this(documentId : UUID, labelerId : Long, elementId : Long) = { 
    this() 
    this.documentId = documentId 
    this.labelerId = labelerId 
    this.elementId = elementId 
    } 
} 

@Entity 
@Table(name = "labeled_element") 
class LabeledElement { 
    @EmbeddedId 
    @BeanProperty 
    @Column(unique = true) 
    var id : LabeledElementKey = _ 

    @MapsId("labelerId") 
    @JoinColumn(name = "labeler_id", referencedColumnName = "id") 
    @ManyToOne(fetch = FetchType.LAZY) 
    var labeler: Labeler = _ 

    @MapsId("elementId") 
    @JoinColumns(Array(
    new JoinColumn (name = "element_id", referencedColumnName = "id"), 
    new JoinColumn (name = "document_id", referencedColumnName = "document_id") 
)) 
    @ManyToOne(fetch = FetchType.LAZY) 
    var element: Element = _ 
// goes on 

用的方式是正確的,現在,我得到的以下錯誤:

org.hibernate.AnnotationException: No identifier specified for entity: model.Element 

您的努力將不勝感激。謝謝!

回答

0

您的元素類有一個註釋@Embeddable而不是@EmbeddedId

+0

我確實經常犯這些愚蠢的錯誤。我改變了它,但似乎沒有改變任何東西 – jagan120

+0

同樣的例外? – fhossfel