15

多対 1 の関係を持つ 2 つのクラス documentlog と documentversion (主キー: int doc_id と int docVersionID) があります。CompundKey という複合キー クラスを使用して、複合主キーを管理しました。docversionID を自動インクリメントする必要がありますが、それができません。この点で私を助けていただけますか?

@Entity
@Table(name = "Documentversion", schema = "DocumentManagement")
public class DocumentVersion implements Serializable { 

 private CompoundKey id;
 private List<DocumentLog> documentLog;

 @OneToMany(mappedBy="documentVersion", targetEntity=DocumentLog.class,  
   cascade ={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
 public List<DocumentLog> getDocumentLog() {
  return documentLog;
 }
 public void setDocumentLog(List<DocumentLog> documentLog) {
  this.documentLog = documentLog;
 }

 @EmbeddedId 
 @AttributeOverride(name="doc_Id", column=@Column(name="doc_Id") )
 public CompoundKey getId() {
  return id;
 }
 public void setId(CompoundKey id) {
  this.id = id;
 } 
}
4

2 に答える 2

12

ドキュメントはこのトピックに関して少し混乱しています...

私の知る限り、複合キーは常に、少なくとも標準のJPAだけでなく、Hibernate Coreを使用して、アプリケーションによって割り当てられる必要がありました(つまり、生成されません)。

8.4。複合識別子としてのコンポーネント

..。

IdentifierGeneratorを使用して複合キーを生成することはできません。代わりに、アプリケーションは独自の識別子を割り当てる必要があります。

ただし、実際には状況が少し異なる場合があります(CompositeUserTypeをIdentifierGeneratorと一緒に使用する代替方法については、HHH-2060および/またはこのスレッドを参照してください)。

さて、Hibernate Annotations 3.5のドキュメントから、最も紛らわしい部分は次のとおりです。

2.2.3.2.4。部分的な識別子の生成

Hibernateは、一部の識別子プロパティの自動生成をサポートしています。@GeneratedValue1つまたは複数のidプロパティでアノテーションを使用するだけ です。

..。

@EmbeddedIdクラス内にプロパティを生成することもできます。

(また、この機能の使用に対するHibernateチームからの警告もお読みください)。

でも、実際の経験はありません。

参考文献

于 2010-11-08T05:50:08.570 に答える
0

@EmbeddedIdの独自のジェネレーターを宣言して、Id生成にシーケンスを使用することができます。

また、シーケンスを自動的に作成するには、偽のエンティティを宣言する必要があります。

于 2013-03-18T14:33:29.943 に答える