这个问题与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方法?
更新:
确实,我注意到,扩展JPARepository
界面中的保存不是默认设置
在这种情况下,实现此目标的最佳方法是什么?
覆盖保存方法
在覆盖的方法中调用父级保存方法
答案 0 :(得分:3)
您定义的默认方法是无助的,因为Spring会开箱即用地实现具有相同擦除的方法(请参见CrudRepository.save()
)。
这里您没有调用接口的default
方法:
JpaRepository.super.save(invoice);
您调用save()
的抽象CrudRepository
方法。
但是它无法编译为abstract
。
如果JpaRepository
超级类定义了默认的save()
方法,则可以像在引用的问题中那样工作,但事实并非如此。
在这种情况下,实现此目标的最佳方法是什么?
您可以创建一个具有不同名称的default
方法,并从中调用save()
,该方法将在运行时调用运行时InvoiceRepository
实例:
default Invoice saveInvoice(Invoice invoice) {
// I do sth here
...
return save(invoice);
}
答案 1 :(得分:2)
对于您而言,方法save()
不是 default
。从代码中,其定义为:
<S extends T> S save(S var1); // abstract, public
注意 -值得一提的是,代码属于工件 org.springframework.data:spring-data-jpa:2.0.9.RELEASE
。
或者,如果我可以说您的推论是不正确的,那么“ default
默认情况下不是隐含的。”