【发布时间】:2012-12-28 23:01:48
【问题描述】:
考虑以下层次结构,其中实体WidgetA 和WidgetB 扩展了抽象Widget 超类:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Widget implements Serializable {
@Column(name="serialNumber", length=64, nullable=false, unique=true)
private String serialNumber;
...
和
@Entity
public class WidgetA extends Widget implements Serializable {
...
和
@Entity
public class WidgetB extends Widget implements Serializable {
...
我需要通过serialNumber 搜索小部件,但我不知道我在运行时要搜索的小部件的具体类型。通过serialNumber 搜索小部件的正确方法是什么,如果serialNumber 是WidgetA 的,则返回WidgetA 的实例,等等?
我试图在Widget DAO 中使用findyBySerialNumber(),但我收到一个错误消息,告诉我无法实例化抽象类,这是有道理的,但我认为持久性提供者会知道如何查看具体的子实体表并返回正确的实例。我能做到吗?
我使用的是“Spring Data JPA”,所以 Widget DAO 真的很简单:
public interface WidgetDAO extends JpaRepository<Widget, Long> {
public Widget findBySerialNumber(String serialNumber);
}
【问题讨论】:
-
查看 findBySerialNumber() 的实现将有助于发现错误
-
是的,请发布 findBySerialNumber()。是否有任何不是 WidgetA 或 WidgetB 类型的数据?
-
@Affe 我添加了 findBySerialNumber() 的实现
-
@MarkRobinson 我添加了 findBySerialNumber() 的实现。并且所有数据都是 WidgetA 或 WidgetB 类型。
-
由于是spring-data-jpa他不会有findBySerialNumber的实现,它是spring-data-jpa使用方法名和参数自动生成的,生成一个“合适的” jpa 查询。
标签: java hibernate inheritance jpa spring-data-jpa