2

私は次の問題を抱えています:

複合主キーを持つ基本クラス(スーパークラスとして使用)があります。そして今、私は基本クラスからサブクラスを正しくセットアップしようとしていますが、これは機能しません!誰かが私を助けてもらえますか?ありがとう

これが私のクラスです:

BasePK.java

@Embeddable
public class BasePK implements Serializeable {
  protected String base1;
  protected Timestamp base2;
  ..
}

Base.java

@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Base implements Serializeable {
  @EmbeddedId
  protected BasePK id;
  ..
}

SubClassA.java

@Entity
public class SubClassA extends Base implements Serializeable {

  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="attrA")
  protected List<SubClassB> attrsB;

  protected String attrA1;
  protected String attrA2;
  ..
}

SubClassB.java

@Entity
public class SubClassB extends Base implements Serializeable {

  @ManyToOne(fetch=FetchType.LAZY)
  private SubClassA attrA;

  protected String attrB1;
  protected String attrB2;
  ..
}

SubClassC.java

@Entity
public class SubClassC extends SubClassA implements Serializeable {


  protected String attrC1;
  protected String attrC2;
  ..
}

プロジェクトを実行しようとすると、次のような例外が発生します。

[EL Info]: 2012-11-01 23:31:18.739--ServerSession(2063330336)--EclipseLink, version: Eclipse Persistence Services - 2.4.1.v20121003-ad44345
[EL Warning]: metadata: 2012-11-01 23:31:19.199--ServerSession(2063330336)--Reverting the lazy setting on the OneToOne or ManyToOne attribute [controlledObject] for the entity class [class logyourlife.entities.ChangeRecord] since weaving was not enabled or did not occur.
[EL Severe]: 2012-11-01 23:31:19.229--ServerSession(2063330336)--Exception [EclipseLink-0] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions: 
---------------------------------------------------------

Exception [EclipseLink-48] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [SUBCLASSB.BASE1].  Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.ManyToOneMapping[attrA]
Descriptor: RelationalDescriptor(test.entities.SubClassB --> [DatabaseTable(SUBCLASSB)])

Exception [EclipseLink-48] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [SUBCLASSB.BASE2].  Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.ManyToOneMapping[attrA]
Descriptor: RelationalDescriptor(test.entities.SubClassB --> [DatabaseTable(SUBCLASSB)])

fyi:equalsおよびhashcodeメソッドはすべてのクラスで上書きされます。

4

1 に答える 1

1

まず、Baseの@Inheritanceアノテーションを削除します。それは何の目的も果たしません。

次に、ManyToOneアソシエーションの結合列を明示的に定義してみてください。EclipseLinkは、埋め込みIDフィールドとSubClassAとの多対1の関連付けの両方に、デフォルトで同じ列名を使用しているようです。このアノテーションの使用例については、http://docs.oracle.com/javaee/6/api/javax/persistence/JoinColumn.htmlを参照してください。

補足:複合IDは非効率的であり、処理が複雑です。すべてのエンティティに自動生成された単一列のIDを使用することを実際に検討する必要があります。すべてがはるかに簡単になります。

于 2012-11-01T23:01:50.970 に答える