2017-09-26 76 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