使用 Spring @Procedure 调用 StoredProcedure 而不绑定到 table
Using Spring @Procedure to call StoredProcedure without binding to a table
我想知道是否可以调用存储过程而不必将其绑定到 Table/Model?
在我的例子中,我在数据库中有一个发送邮件的存储过程。我想从 Spring:
调用它
public interface SendEmail extends org.springframework.data.repository.Repository<Email, Long> {
@Procedure(procedureName = "send_email")
void sendEmail(String sender, String recipient, String ccRecipient, String subject, String message);
}
上面的代码编译和运行都很好——没问题。唯一的问题是我想摆脱 extends Repository<Email, Long>
- 我该怎么做?如果我只是删除 <Email, Long>
(因为 StoredProcedure 没有 return 任何东西,因此不需要类型):
public interface SendEmail extends org.springframework.data.repository.Repository {
@Procedure(procedureName = "send_email")
void sendEmail(String sender, String recipient, String ccRecipient, String subject, String message);
}
然后我得到以下错误:
Caused by: java.lang.IllegalArgumentException: Could not resolve id type of interface x.x.x.x.SendEmail!
at org.springframework.data.repository.core.support.DefaultRepositoryMetadata.resolveIdType(DefaultRepositoryMetadata.java:81) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.repository.core.support.DefaultRepositoryMetadata.<init>(DefaultRepositoryMetadata.java:52) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.repository.core.support.AbstractRepositoryMetadata.getMetadata(AbstractRepositoryMetadata.java:71) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepositoryMetadata(RepositoryFactorySupport.java:233) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:260) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:101) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
... 41 common frames omitted
如果我删除 extends Repository<Email, Long>
并且有:
public interface SendEmail {
@Procedure(procedureName = "send_email")
void sendEmail(String sender, String recipient, String ccRecipient, String subject, String message);
}
然后我得到以下错误:
Description:
Field sendEmail in x.x.x.EmailService required a bean of type 'x.x.x.SendEmail' that could not be found.
Action:
Consider defining a bean of type 'x.x.x.SendEmail' in your configuration.
作为结论,我需要一个名为 Email
的模型,该模型映射到数据库中的 table 才能使上述工作正常进行。为什么会这样?
(我尝试用@Repositories
和@Component
注释界面)
Repositories
基于存储库的域驱动设计概念:一个对象,其行为类似于聚合根的集合,但内容存储在某个持久存储中。因此 Repository
需要知道它负责的聚合根以及它的 id 类型才能在商店中找到它。
对于 JPA 存储库,这意味着聚合必须是 JPA 映射的实体。肯定有可能实现基于 POJO 实体并由存储过程支持的存储库。这个想法没有错,只是它不是一个常见的用例,而且对于你的用例来说可能有点矫枉过正。
如果您只想调用一个存储过程,您最好使用一个简单的 Spring bean 和一个 JdbcTemplate
.
您可以这样使用:
@Repository
public class RepositoryClass implements DataRepository {
@PersistenceContext
private EntityManager em;
}
我想知道是否可以调用存储过程而不必将其绑定到 Table/Model?
在我的例子中,我在数据库中有一个发送邮件的存储过程。我想从 Spring:
调用它public interface SendEmail extends org.springframework.data.repository.Repository<Email, Long> {
@Procedure(procedureName = "send_email")
void sendEmail(String sender, String recipient, String ccRecipient, String subject, String message);
}
上面的代码编译和运行都很好——没问题。唯一的问题是我想摆脱 extends Repository<Email, Long>
- 我该怎么做?如果我只是删除 <Email, Long>
(因为 StoredProcedure 没有 return 任何东西,因此不需要类型):
public interface SendEmail extends org.springframework.data.repository.Repository {
@Procedure(procedureName = "send_email")
void sendEmail(String sender, String recipient, String ccRecipient, String subject, String message);
}
然后我得到以下错误:
Caused by: java.lang.IllegalArgumentException: Could not resolve id type of interface x.x.x.x.SendEmail!
at org.springframework.data.repository.core.support.DefaultRepositoryMetadata.resolveIdType(DefaultRepositoryMetadata.java:81) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.repository.core.support.DefaultRepositoryMetadata.<init>(DefaultRepositoryMetadata.java:52) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.repository.core.support.AbstractRepositoryMetadata.getMetadata(AbstractRepositoryMetadata.java:71) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepositoryMetadata(RepositoryFactorySupport.java:233) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:260) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:101) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
... 41 common frames omitted
如果我删除 extends Repository<Email, Long>
并且有:
public interface SendEmail {
@Procedure(procedureName = "send_email")
void sendEmail(String sender, String recipient, String ccRecipient, String subject, String message);
}
然后我得到以下错误:
Description:
Field sendEmail in x.x.x.EmailService required a bean of type 'x.x.x.SendEmail' that could not be found.
Action:
Consider defining a bean of type 'x.x.x.SendEmail' in your configuration.
作为结论,我需要一个名为 Email
的模型,该模型映射到数据库中的 table 才能使上述工作正常进行。为什么会这样?
(我尝试用@Repositories
和@Component
注释界面)
Repositories
基于存储库的域驱动设计概念:一个对象,其行为类似于聚合根的集合,但内容存储在某个持久存储中。因此 Repository
需要知道它负责的聚合根以及它的 id 类型才能在商店中找到它。
对于 JPA 存储库,这意味着聚合必须是 JPA 映射的实体。肯定有可能实现基于 POJO 实体并由存储过程支持的存储库。这个想法没有错,只是它不是一个常见的用例,而且对于你的用例来说可能有点矫枉过正。
如果您只想调用一个存储过程,您最好使用一个简单的 Spring bean 和一个 JdbcTemplate
.
您可以这样使用:
@Repository
public class RepositoryClass implements DataRepository {
@PersistenceContext
private EntityManager em;
}