1

Ebean in Play で継承を使ってみました!フレームワーク 2.1.0。Ebean がサポートする唯一の継承戦略は「単一テーブル」です。JPA Wikibookの例に厳密に従います

@Entity
@Inheritance
@DiscriminatorColumn(name="price_type")
@Table(name="prices")
public abstract class Price {
    
    @Id
    public long id;

    // Price value
    @Column(precision=2, scale=18)
    public BigDecimal value;

}


@Entity
@DiscriminatorValue("F")
public class FixedPrice extends Price {

    // NO id field here        
    ...
}

@Entity
@DiscriminatorValue("V")
public class VariablePrice extends Price {
    
    // NO id field here
    ...
}

このコードはコンパイルに合格しますが、

RuntimeException: Abstract class with no readMethod for models.Price.id
com.avaje.ebeaninternal.server.deploy.ReflectGetter.create(ReflectGetter.java:33)

 com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.setBeanReflect(BeanDescriptorManager.java:1353)

 com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.createByteCode(BeanDescriptorManager.java:1142)

 com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readDeployAssociations(BeanDescriptorManager.java:1058)

 com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.readEntityDeploymentAssociations(BeanDescriptorManager.java:565)

 com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:252)

 com.avaje.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:124)
    com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:210)

 com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:64)

 com.avaje.ebean.EbeanServerFactory.create(EbeanServerFactory.java:59)

 play.db.ebean.EbeanPlugin.onStart(EbeanPlugin.java:79) 

Google 検索では、ReflectGetter.java のソース コードである関連リンクが 1 つだけ表示されます。そこのコメントは言う

id プロパティを保持する抽象クラスの場合、リフレクションを使用して id 値を取得する必要があります。

これは、それを行うための BeanReflectGetter オブジェクトを提供します。

スーパークラス宣言からキーワードを削除するabstractと、例外が消えます。ただし、スーパークラスのコンクリートを作成しないことを本当に望んでいます。

4

1 に答える 1

4

id フィールドに getter/setter を追加すると、消えます。

于 2013-08-24T22:47:51.160 に答える