Spring - JPA - Hibernate如何使用EntityManager

时间:2017-12-27 15:31:13

标签: java spring hibernate jpa vue.js

我正在尝试使用以下技术堆栈构建REST应用程序:

  • 弹簧
  • VueJs
  • JPA(Hibernate)

这是我在编写Sping应用程序和Web应用程序开发方面的第一次经验。

我的DataBase中有4个表:

  • 语言
  • 规则
  • 用户

例如,在规则中有:

Rule create(EntityManagerFactory factory, String type, String hint, String help, Language language); 
List<Rule> readAll(EntityManagerFactory factory);
Rule readID(EntityManagerFactory factory, int id); 
void update(EntityManagerFactory factory, String type, String hint, String help, Language language);

所以有我的问题:

  1. 当我为每个表创建控制器时,我使用CRUD方法修改(或不修改)我的数据库,并返回我的HTMLVueJS部分的视图。但我的方法需要一个EntityManagerFactory,我应该在每个Controllers类中创建一个字段,还是这不是我应该做的?
  2. 我是否需要创建bean文件并对其进行配置,或persistence.xmlpom.xml是否足够?
  3. 由于

3 个答案:

答案 0 :(得分:2)

如果您使用的是Spring Boot,那么您不需要实体经理。您需要做的就是在属性文件中定义数据源。并在我们的Configuration类中创建一个Bean,如:

@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource datasource() {
    return DataSourceBuilder.create().build();
}

现在您可以使用存储库处理的其他内容。它们将是:

import org.springframework.data.repository.CrudRepository;

public interface RuleRepository extends CrudRepository<Rule, Long>  {

}

在您的控制器中,您将使用它:

@Autowired
private RuleRepository ruleRepository;

@Get
@Path("/getRule/:id")
public Rule find(@PathParam("id")Long id){
    return ruleRepository.findOne(id);
}

我在gradle项目中使用的这些依赖项。你会发现相同的Maven版本:

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile group: 'mysql', name: 'mysql-connector-java'

答案 1 :(得分:2)

似乎您的第一个问题可以分解为多个问题。

  

当我为每个表创建控制器时,我使用CRUD方法修改(或不修改)我的数据库,并返回我的HTML和VueJS部分的视图。但我的方法需要一个EntityManagerFactory,我应该在每个Controllers类中创建一个字段,或者这不是我应该怎么做的?

由于您已经接受了建议使用spring-data-jpa的答案。您将处理实体和存储库。

实体是JPA托管bean,它将与您的数据库进行交互。

@Entity
@Table(name = "rule")
public class Rule {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    long id;
    String type;
    ...
    @OneToOne
    @JoinColumn(...)
    Language language;
}

存储库将提供对数据库执行操作所需的所有必要操作。使用JPA,您可以创建一个扩展CrudRepository的接口,它将为您提供一些免费的CRUD操作。 findOne(/* id */)delete()save()

@Repository
public interface RuleRepository extends CrudRepository<Rule, Long> {

     // You can easily specify custom finders
     public List<Rule> findByType(String type);

}
  

但是我的方法需要一个EntityManagerFactory,我应该在每个Controllers类中创建一个字段,还是这不是我应该做的?

通常不赞成将请求/响应对象作为JPA实体。请参阅should i use jpa entity in rest request and/or response

的关联答案

您可以采取多种方法来获取控制器请求并向客户端项目发送响应。

@Controller
public class RuleController {
    @Autowired
    private RuleRepository ruleRepository;

    // Approach 1: Use Request Parameters - enforce inputs
    @PostMapping("/rule/:id")
    public Rule postWithRequestParams(@PathParam("id") Long id, 
                    @RequestParam("type") String type, 
                    @RequestParam("hint") String hint, 
                    @RequestParam("languageField1") String languageField1) {
        Rule inputRule = new Rule(id, type, hint, new Language(languageField1));

        Rule responseRule = ruleRepository.save(inputRule);
        return responseRule; // I would imagine you would want to set up a model for the response itself
    }



    // Approach 2: Use RequestBody - serialize Rule from the request
    @PostMapping("/rule/:id")
    public Rule postWithRequestParams(@PathParam("id") Long id, @RequestBody Rule inputRule) {
        Rule responseRule = ruleRepository.save(inputRule);
        return responseRule;
    }
  

我是否需要创建bean文件并对其进行配置,或者persistence.xml和pom.xml是否足够?

如果您已将spring-boot-starter-data-jpa添加为依赖项,则已经为您完成了很多bean配置。

main/src/resources中(您应该有application.propertiesapplication.yml

spring.datasource.url= # JDBC url of the database.
spring.datasource.username= # Login user of the database.
spring.datasource.password= # Login password of the database.

Spring为你做了很多神奇而繁重的工作。

答案 2 :(得分:0)

您肯定需要查看Spring Data JPAhttp://start.spring.io),它可以更轻松地启动Web应用程序开发。对于持久层,您可以使用save(), remove(), find()(已包含Hibernate)模块,该模块也可以与Spring Boot轻松集成。 Spring Data的优点是默认情况下已经编写了大多数查询,例如Starting Neo4j. WARNING: Max 4096 open files allowed, minimum of 40000 recommended. See the Neo4j manual. /usr/share/neo4j/bin/neo4j: line 411: /var/run/neo4j/neo4j.pid: No such file or directory 等等。您只需要定义将由Spring Data使用的对象。

更新:请参阅我的Spring Boot REST API示例here