我尝试在 Play 中使用 Ebean 继承!框架 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)
谷歌搜索只带来一个相关链接,即 ReflectGetter.java 的源代码。那里的评论说
对于持有 id 属性的抽象类,我们有时需要使用反射来获取 id 值。
这提供了 BeanReflectGetter 对象来执行此操作。
如果我abstract
从超类声明中删除关键字,异常就会消失。不过,我真的不希望将超类具体化。