示されているテーブルスキーマに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;
}
}
コンポジットキーでの試行も失敗し、同じエラーが発生しました。
多くのインターネット検索はまだ解決策につながりません。