示されているテーブルスキーマにJPAクラスを構築しているときに発生するエラーが含まれています...このエラーを解決する方法を誰かに教えてもらえますか?また、キーの1つが実際に外部キーである場合の複合キーの作成方法。私の注釈の何が問題になっていますか?
エラー
org.apache.openjpa.util.MetaDataException:タイプ「classSpecialty」で指定されたidクラスが、クラスの主キーフィールドと一致しません。 IDクラスに、pkフィールドタイプを含む永続タイプと同じ主キーがあることを確認してください。不一致のプロパティ: "personId"
テーブルスキーマ
テーブルLocation(を作成します id int主キー、 シティvarchar(255)、 状態varchar(100)、 国varchar(255) ); テーブルPerson(を作成します id int主キー、 名前varchar(100) ); テーブルを作成するフォトグラファー( id int主キーはPerson(id)を更新カスケードで削除カスケードで参照します。 LivesIn int not null参照Location(id)on updatecascade on delete no action ); テーブルSpecialty(を作成します フォトグラファーintは、カスケードの削除の更新カスケードでフォトグラファー(id)を参照します。 タイプenum('portrait'、'landscape'、'sport')、 主キー(写真家、タイプ) ); テーブルの作成Photo( id int主キー、 takeAtタイムスタンプがnullではない、 TakenBy intは、アクションなしの削除時の更新カスケードでフォトグラファー(id)を参照します。 photosedAt intは、アクションなしの削除時の更新カスケードのLocation(id)を参照します。 タイプenum('portrait'、'landscape'、'sport') ); テーブルの外観を作成します( 削除カスケードでの更新カスケードでのint参照Person(id)を示します。 isShownIn intは、カスケードの削除時にカスケードを更新するときにPhoto(id)を参照します。 主キー(shows、isShownIn) );
クラス
Person.java
@実在物 パブリッククラスPersonはSerializableを実装します{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; プライベート文字列名。
Location.java
@実在物 パブリッククラスLocationはSerializable{を実装します @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; プライベートストリングシティ; プライベート文字列状態。 プライベート文字列の国;
Photographer.java
@実在物 パブリッククラスのフォトグラファーはSerializableを実装します{ @Id @ManyToOne @Column(name = "id") プライベートパーソンpersonId; @ManyToOne @Column(name = "livesIn") プライベートロケーションlivesIn;
Photo.java
@実在物 パブリッククラスの写真はSerializableを実装します{ @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; // 外部キー @ManyToOne @JoinColumn(name = "takenBy") プライベートフォトグラファーtakenBy; // 外部キー @ManyToOne @JoinColumn(name = "photographedAt") プライベートロケーションphotographedAt; @Basic(オプション= false) @Column(name = "takenAt"、insertable = false、updatable = false) @Temporal(TemporalType.DATE) プライベート撮影日; @ Enumerated(EnumType.STRING) プライベートPhotoTypeタイプ。
PhotoType
public enum PhotoType { PORTRAIT( "portrait")、LANDSCAPE( "landscape")、SPORT( "sport"); プライベート文字列型。 PhotoType(文字列型){ this.type = type; } public String getType(){ リターンタイプ; } }
Specialty.java
インポートjava.io.Serializable; インポートjavax.persistence.Column; インポートjavax.persistence.Embeddable; インポートjavax.persistence.EmbeddedId; インポートjavax.persistence.Entity; インポートjavax.persistence.EnumType; インポートjavax.persistence.Enumerated; インポートjavax.persistence.Id; インポートjavax.persistence.JoinColumn; インポートjavax.persistence.ManyToOne; インポートjavax.persistence.OneToMany; インポートjavax.persistence.OneToOne; @実在物 パブリッククラスSpecialtyはSerializableを実装します{ @EmbeddedId 保護されたSpecialtyPKspecialtyPK; public Specialty(){ 素晴らしい(); } public Specialty(SpecialtyPK specialtyPK){ 素晴らしい(); this.specialtyPK = specialtyPK; } } @Embeddable クラスSpecialtyPKはSerializableを実装します{ @ManyToOne @Column(name = "id") プライベートフォトグラファーpersonId; @ Enumerated(EnumType.STRING) プライベートPhotoTypeタイプ。 / * *(Javadoc以外) * * @see java.lang.Object#hashCode() * / @オーバーライド public int hashCode(){ 最終的なintプライム=31; int result = 1; 結果=プライム*結果 +((personId == null)?0:personId.hashCode()); 結果=プライム*結果+((type == null)?0:type.hashCode()); 結果を返します。 } / * *(Javadoc以外) * * @see java.lang.Object#equals(java.lang.Object) * / @オーバーライド public boolean equals(Object obj){ if(this == obj) trueを返します。 if(obj == null) falseを返します。 if(getClass()!= obj.getClass()) falseを返します。 SpecialtyPK other =(SpecialtyPK)obj; if(personId == null){ if(other.personId!= null) falseを返します。 } else if(!personId.equals(other.personId)) falseを返します。 if(type!= other.type) falseを返します。 trueを返します。 } public SpecialtyPK(){ 素晴らしい(); //TODO自動生成されたコンストラクタスタブ } public SpecialtyPK(フォトグラファーpersonId、PhotoTypeタイプ){ 素晴らしい(); this.personId = personId; this.type = type; } }
コンポジットキーでの試行も失敗し、同じエラーが発生しました。
多くのインターネット検索はまだ解決策につながりません。