【问题标题】:How to use entitymanager with Micronaut?如何在 Micronaut 中使用 entitymanager?
【发布时间】:2019-03-05 10:01:59
【问题描述】:

我是 Micronaut 框架的新手,我正在尝试使用 entitymanager 创建我的存储库。 我像这样创建了我的存储库

public interface EmployeeRepository {
    Employee save(@NotNull Employee employee);
    Employee update(@NotNull Employee employee);
    List<Employee> findAll();
    Optional<Employee> findById(@NotNull Long id);
}

我使用这个类来实现接口并注入实体管理器

@Singleton
public class EmployeeRepositoryImpl implements EmployeeRepository{
    @PersistenceContext
    private EntityManager entityManager;

    public EmployeeRepositoryImpl(@CurrentSession EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    @Transactional
    public Employee save(@NotNull Employee employee) {
        entityManager.persist(employee);
        return employee;
    }

    @Override
    @Transactional
    public Employee update(@NotNull Employee employee) {
        return entityManager.merge(employee);
    }

    @Override
    @Transactional(readOnly = true)
    public List<Employee> findAll() {
        String qlString = "SELECT * FROM Employee";
        TypedQuery<Employee> query = entityManager.createQuery(qlString, Employee.class);
        return query.getResultList();
    }

    @Override
    @Transactional(readOnly = true)
    public Optional<Employee> findById(@NotNull Long id) {
        return Optional.ofNullable(entityManager.find(Employee.class, id));
    }
}

问题是我一直有这个错误:

Message: No bean of type [javax.persistence.EntityManager] exists. Ensure the class is declared a bean and if you are using Java or Kotlin make sure you have enabled annotation processing.
Path Taken: new $EmployeeControllerDefinition$Intercepted([EmployeeRepositoryImpl employeeRepository],BeanContext beanContext,Interceptor[] interceptors) --> new $EmployeeRepositoryImplDefinition$Intercepted([EntityManager entityManager],BeanContext beanContext,Interceptor[] interceptors)
io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [entityManager] of class: com.milamed.dao.$EmployeeRepositoryImplDefinition$Intercepted

PS:我开启了注解处理

【问题讨论】:

  • 你在用io.micronaut.configuration:micronaut-hibernate-jpa吗?
  • jpa.default.packages-to-scan 属性没有指向实体对象(而是指向我的DAO 包)时,就会发生这种情况。修复创建 EntityManager 的问题。与此相关的错误消息可以改进 IMO。

标签: java entitymanager micronaut


【解决方案1】:

您没有提供足够的项目信息来确定缺少什么,但我在https://github.com/jeffbrown/mohamedmiledijpa 为您创建了一个工作示例。

https://github.com/jeffbrown/mohamedmiledijpa/blob/master/src/main/java/mohamedmiledijpa/Employee.java

package mohamedmiledijpa;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Employee {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

https://github.com/jeffbrown/mohamedmiledijpa/blob/master/src/main/java/mohamedmiledijpa/EmployeeRepository.java

package mohamedmiledijpa;

import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Optional;

public interface EmployeeRepository {
    Employee save(@NotNull Employee employee);
    Employee update(@NotNull Employee employee);
    List<Employee> findAll();
    Optional<Employee> findById(@NotNull Long id);
}

https://github.com/jeffbrown/mohamedmiledijpa/blob/master/src/main/java/mohamedmiledijpa/EmployeeRepositoryImpl.java

package mohamedmiledijpa;

import io.micronaut.configuration.hibernate.jpa.scope.CurrentSession;
import io.micronaut.spring.tx.annotation.Transactional;

import javax.inject.Singleton;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Optional;

@Singleton
public class EmployeeRepositoryImpl implements EmployeeRepository{
    @PersistenceContext
    private EntityManager entityManager;

    public EmployeeRepositoryImpl(@CurrentSession EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    @Transactional
    public Employee save(@NotNull Employee employee) {
        entityManager.persist(employee);
        return employee;
    }

    @Override
    @Transactional
    public Employee update(@NotNull Employee employee) {
        return entityManager.merge(employee);
    }

    @Override
    @Transactional(readOnly = true)
    public List<Employee> findAll() {
        String qlString = "SELECT e FROM Employee e";
        TypedQuery<Employee> query = entityManager.createQuery(qlString, Employee.class);
        return query.getResultList();
    }

    @Override
    @Transactional(readOnly = true)
    public Optional<Employee> findById(@NotNull Long id) {
        return Optional.ofNullable(entityManager.find(Employee.class, id));
    }
}

https://github.com/jeffbrown/mohamedmiledijpa/blob/master/src/main/java/mohamedmiledijpa/EmployeeController.java

package mohamedmiledijpa;

import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Post;

import java.util.List;

@Controller("/employee")
public class EmployeeController {

    private EmployeeRepository employeeRepository;

    public EmployeeController(EmployeeRepository employeeRepository) {
        this.employeeRepository = employeeRepository;
    }

    @Get("/")
    public List<Employee> list() {
        return employeeRepository.findAll();
    }

    @Post("/")
    public Employee create(@Body Employee employee) {
        return employeeRepository.save(employee);
    }
}

https://github.com/jeffbrown/mohamedmiledijpa/blob/f6500d3fb24190ed59ca64dcc28a02f8069fedfd/build.gradle#L29

compile "io.micronaut.configuration:micronaut-hibernate-jpa"

似乎一切正常:

~ $ curl http://localhost:8080/employee
[]
~ $ 
~ $ curl -d '{"name":"Jake"}' -H "Content-Type: application/json" -X POST  http://localhost:8080/employee
{"id":1,"name":"Jake"}
~ $ 
~ $ curl -d '{"name":"Zack"}' -H "Content-Type: application/json" -X POST  http://localhost:8080/employee
{"id":2,"name":"Zack"}
~ $ 
~ $ curl http://localhost:8080/employee
[{"id":1,"name":"Jake"},{"id":2,"name":"Zack"}]

【讨论】:

  • 感谢您的回复,但仍然无法解决同样的错误。也许问题出在我的配置中,这是我的 application.yml 文件micronaut: application: name: micronaut jpa: default: properties: hibernate: hbm2ddl: auto: update dataSource: dbCreate: create-update pooled: true jmxExport: true driverClassName: com.mysql.jdbc.Driver username: root password: dialect: org.hibernate.dialect.MySQL5InnoDBDialect url: jdbc:mysql://localhost:3306/micronaut
  • @MohamedMiledi 有很多事情可能是错误的。如果您可以共享一个演示错误的项目,则可以对其进行诊断。您问“如何将 entitymanager 与 Micronaut 一起使用?”上面链接的项目向您展示了一种方法。
  • 您的Application 课程在哪个包中,您的@Entity 课程在哪个包中?
  • 好的,这是github repo的链接https://github.com/milamed/micronaut.git
  • github.com/milamed/micronaut/blob/… 的配置有一些问题。很难说您的意图是什么,但您缺少 default 配置。运行mn create-app --features hibernate-jpa com.milamed.micronaut 并将生成的src/main/resources/application.yml 与您的进行比较。
【解决方案2】:

我遇到了这个问题,我找到了解决方案:

如果你使用@PersistenceContext 来注入EntityManger,你需要包含这个依赖:

{使用 Gradle}

compile "io.micronaut.configuration:micronaut-jdbc-hikari"

或 {使用 Maven}

<dependency>
  <groupId>io.micronaut.sql</groupId>
  <artifactId>micronaut-jdbc-hikari</artifactId>
  <scope>compile</scope>
</dependency>

因为这是 micronaut 定位您的 application.yml 中定义的数据源的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 2019-04-11
    • 1970-01-01
    • 2011-12-26
    • 2021-11-02
    • 2011-07-13
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多