Spring-Boot/JPA:包和实体有问题

Spring-Boot/JPA: Problem with packages and Entities

我有一个 Spring- 带有组件和预定功能的启动应用程序。

package My.A;

@SpringBootApplication
@EnableScheduling
public class MyApp 
{
    public static void main (String args []) throws Exception
    {
      SpringApplication.run (MyApp.class, args);    
    }
}

组件:

package My.A;

@Component
public class MyComp
{   

  @Scheduled (fixedRate = 3000)
  public void foo ()
  {
    System.out.println ("foo");
  }
}

一切正常,我每 3 秒打印一次“foo”。

现在我想添加JPA。这不是我第一次使用 JPA。

但这是我第一次将实体放在另一个包中 (My.B)。

package My.B;

@Entity
@SequenceGenerator (name = "seq", initialValue = 1)
public class MyRecord
{ 
....

我在应用程序中添加了一个存储库以访问数据库。

package My.A;

public interface MyRecordRepo extends CrudRepository <MyRecord, Long> 
{
}

然后我添加注解让MyApp找到My.B的MyRecord。

package My.A;

@SpringBootApplication
@EnableScheduling
@EnableJpaRepositories ("My.B.*")                    // NEW
@ComponentScan (basePackages = { "My.B.*" })         // NEW

public class WebApplication 
{
...

否则,MyApp 将在启动时抛出一个异常,指出找不到实体。 使用注释,它可以编译并正常启动。

但是现在我的预定函数 foo 没有被触发。 我尝试将 My.A.* 添加到 ComponentScan 中,但没有成功。

@ComponentScan (basePackages = { "My.B.*", "My.A.*" })   

Think MyApp 现在没有找到自己的组件。

我怎样才能取回计划的功能并在我的主包之外获得带有 class 的 JPA?

@EntityScan("My.B") 添加到您的配置中。

当您使用 @ComponentScan 时,它会禁用 Spring 启动 auto-configuration 扫描,您必须手动指定所有使用的包。

此外,您不需要 @EnableJpaRepositories - Spring 如果 Boot 在类路径上找到 Spring Data JPA,它会自动执行此操作。

不需要.* 组件扫描的工作方式是如果你只定义

@ComponentScan (basePackages = { "My" }) 

它将深入到它的所有子文件夹,包括 A 和 B 包。

但是如果你想将扫描限制在特定的包中,那么你可以写

@ComponentScan (basePackages = { "My.B", "My.A" })