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" })
我有一个 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" })