我正在尝试使用以下技术堆栈构建REST
应用程序:
这是我在编写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);
所以有我的问题:
HTML
和VueJS
部分的视图。但我的方法需要一个EntityManagerFactory,我应该在每个Controllers类中创建一个字段,还是这不是我应该做的?persistence.xml
和pom.xml
是否足够?由于
答案 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.properties
或application.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 JPA
(http://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