2017-09-26 9 views
0

シナリオ:私はPostgres DBにDocumentとElementという名前のテーブルを2つ持っています。それらの間の関係は1対多である(1つの文書には多くの要素がある)。したがって、要素表には文書IDの外部キーがあります。今度は、各文書idの初期値から始まる要素IDのシーケンスを持つ必要があります。JPA - 各外部キーのシーケンスID(一意でない)を生成し、複合キーを作成

例:

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

エレメントクラスには、@EmbeddedIdではなく、@Embeddableというアノテーションがあります。

+0

私は時々これらのばかげた間違いをします。私はそれを変更しましたが、何も変更されていないようです – jagan120

+0

同じ例外ですか? – fhossfel

関連する問題