1

具象クラスに共通のフィールドを含むマップされたスーパークラスがある継承構造に苦労しています。このスーパークラスには、「ラッパー」オブジェクトとの 1 対 1 のマッピングがあります。

オブジェクトは次のようになります。

@Entity
public class Wrapper {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "wrapper_id", nullable = false)
    private Long wrapperId;

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "wrapper")
    @Cascade(CascadeType.SAVE_UPDATE)
    private Base base;

    public Long getWrapperId() {
        return wrapperId;
    }

    public void setWrapperId(Long wrapperId) {
        this.wrapperId = wrapperId;
    }

    public Base getBase() {
        return base;
    }

    public void setBase(Base base) {
        this.base = base;
    }

}

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Base {

    @OneToOne(fetch = FetchType.LAZY)
    @Cascade(CascadeType.SAVE_UPDATE)
    @JoinColumn(name = "wrapper_id")
    protected Wrapper wrapper;

    public Wrapper getWrapper() {
        return wrapper;
    }

    public void setWrapper(Wrapper wrapper) {
        this.wrapper = wrapper;
    }

}

@Entity
public class SubA extends Base {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "sub_a_id", nullable = false)
    private Long subAId;

    public Long getSubAId() {
        return subAId;
    }

    public void setSubAId(Long subAId) {
        this.subAId = subAId;
    }

}

簡単にするために、具体的なクラスを 1 つだけ含めましたが、いくつかあります。

このマッピングは、ラッパー オブジェクトに「ベース」への参照がない場合にうまく機能します。ラッパーとベースの間に双方向の関係を追加しようとするとすぐに、このエラーが発生し始めます....フィールドがあるので意味がありません。

Caused by: org.hibernate.AnnotationException: Unknown mappedBy in: com.xxx.Wrapper.base, referenced property unknown: com.xxx.Base.wrapper
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:153)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1697)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:453)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:438)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564)
    ... 50 more

私は何が欠けていますか?ありがとう、

4

3 に答える 3

3

Java Platform, Enterprise Edition からの引用: Java EE チュートリアル:

37.2.2 マップされたスーパークラス

エンティティは、永続的な状態とマッピング情報を含むスーパークラスから継承できますが、エンティティではありません。つまり、スーパークラスは @Entity アノテーションで装飾されておらず、Java Persistence プロバイダーによってエンティティーとしてマップされていません。これらのスーパークラスは、複数のエンティティ クラスに共通の状態およびマッピング情報がある場合に最もよく使用されます。マップされたスーパークラスは、注釈 javax.persistence.MappedSuperclass でクラスを装飾することによって指定されます。

...

マップされたスーパークラスは照会できず、EntityManager または Query 操作で使用できません。EntityManager または Query 操作では、マップされたスーパークラスのエンティティ サブクラスを使用する必要があります。マップされたスーパークラスは、エンティティ関係のターゲットにすることはできません。

したがって、エンティティ関係ではこの基本クラスを使用できないようです。

@OneToOne(fetch = FetchType.LAZY, mappedBy = "wrapper")
@Cascade(CascadeType.SAVE_UPDATE)
private Base base;
于 2015-11-27T14:25:23.357 に答える