シナリオ:私は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の複合キーを持つ要素標識という要素と別のテーブルの間に次のレベルの関係があります。
質問:
各文書IDの初期値から始めるためのシーケンスを生成する方法は?
複合キーの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
あなたの努力に感謝します。ありがとう!
私は時々これらのばかげた間違いをします。私はそれを変更しましたが、何も変更されていないようです – jagan120
同じ例外ですか? – fhossfel