这个问题与this one相同。
我有一个界面,如:
@Repository
public interface InvoiceRepository extends JpaRepository<Invoice, String>{
// some other methods here
default Invoice save(Invoice invoice) {
//I do sth here
return JpaRepository.super.save(invoice); // wonT work
}
}
如何调用已实现的JPA接口的save方法?
更新:确实我注意到,save不是扩展的JPARepository
界面中的默认值
在这种情况下,实现这一目标的最佳方法是什么?
你定义的默认方法是无助的,因为Spring将开箱即用一个具有相同擦除的方法(参见CrudRepository.save()
)。
在这里,您不要调用接口的default
方法:
JpaRepository.super.save(invoice);
你调用save()
的抽象CrudRepository
方法。
但它无法编译,因为它是abstract
。
如果JpaRepository
super类定义了默认的save()
方法,那么它可以像引用的问题那样工作,但事实并非如此。
在这种情况下,实现这一目标的最佳方法是什么?
您可以创建一个具有不同名称的default
方法,并从中调用save()
,在运行时将调用运行时InvoiceRepository
实例:
default Invoice saveInvoice(Invoice invoice) {
// I do sth here
...
return save(invoice);
}
在你的情况下,方法save()
不是default
。从代码中,它定义为:
<S extends T> S save(S var1); // abstract, public
注 - 值得一提的是,代码属于人工制品org.springframework.data:spring-data-jpa:2.0.9.RELEASE
。
或者如果我可以说,你的推断是不正确的,“默认情况下不暗示default
。”