Micronaut - 无法使用 PersistenceContext

Micronaut - not possible to use PersistenceContext

我是 micronaut 的新手,我尝试遵循这个小 project。但是我希望它能与 postgres 一起工作。

我的 application.yml 看起来像这样:

micronaut:
  application:
    name: hello-world
  datasources:
    default:
      url: 'jdbc:postgresql://localhost:5432/test'
      username: test
      password: test
      driver-class-name: org.postgresql.Driver
  jpa:
    default:
      properties:
        hibernate:
          hbm2ddl:
            auto: update
          show_sql: true

我可以通过 intellij 访问数据库。 在 pom.xml 我有以下依赖项:

       <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.8</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>io.micronaut.configuration</groupId>
            <artifactId>micronaut-jdbc-hikari</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>io.micronaut.configuration</groupId>
            <artifactId>micronaut-hibernate-jpa</artifactId>
        </dependency>

此外,link 中提到需要 annotionProcessor,所以我将其添加到我的构建配置文件中:

<annotationProcessorPaths>
    <path>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
    </path>
</annotationProcessorPaths>

所以现在每次我尝试执行以下操作时:

@PersistenceContext
private EntityManager entityManager;

我收到以下错误:

Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [javax.persistence.EntityManager] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).

不过我已经启用了 annotation processing。我还有一个 @Entity-class:

@Entity
@Table(name = "users")
public class User {

    @NotBlank
    @Column(name = "name")
    private String userName;


    public User() {
    }


    public User(@NotBlank final String userName) {
        this.userName = userName;
    }


    public String getUserName() {
        return userName;
    }


    public void setUserName(final String userName) {
        this.userName = userName;
    }
}

我的设置中到底缺少什么?

我的设置存在多个问题。

  1. datasourcejpa 需要在根级别
  2. @Entity需要一个@Id

所以最后 application.yml 看起来像这样:

micronaut:
  application:
    name: hello-world
datasources:
  default:
    url: 'jdbc:postgresql://localhost:5432/test'
    username: test
    password: test
    driver-class-name: org.postgresql.Driver
jpa:
  default:
    packages-to-scan:
      - 'test'
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        show_sql: true

@Entity-Class 需要一个 @Id-属性:

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;


    @NotBlank
    @Column(name = "user_name")
    private String userName;


    public User() {
    }


    public User(@NotBlank final String userName) {
        this.userName = userName;
    }


    public String getUserName() {
        return userName;
    }


    public void setUserName(final String userName) {
        this.userName = userName;
    }


    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                '}';
    }
}