java - JPA:无法使用@EntityScan 找到实体
问题描述
我对 JPA 和 ORM 真的很陌生,所以我希望你能原谅我的愚蠢问题。我在这个博客和网络上的其他地方阅读了很多帖子,但建议的解决方案,即使它们看起来很合理,对我也不起作用。
我有一个众所周知的例外:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'issueService': Unsatisfied dependency expressed through field 'issueRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'issueRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class org.html.topolino.model.Issue
由于这似乎是一个可见性问题,我按照网上的建议修改了我的 SpringBootApplication:
package org.html.topolino;
import org.apache.log4j.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
//@EntityScan(basePackages = {"org.html.topolino.model"})
//@EnableJpaRepositories(basePackages = {"org.html.topolino.repositories"})
//@ComponentScan({"org.html.topolino.services", "org.html.topolino.controllers", "org.html.topolino.repositories", "org.html.topolino.model"})
public class TopolinoApplication
{
static Logger logger = Logger.getLogger(TopolinoApplication.class.getName());
public static void main(String[] args)
{
logger.info("Starting TopolinoApplication...");
SpringApplication.run(TopolinoApplication.class, args);
logger.info("Started TopolinoApplication");
}
}
这是我的控制器:
package org.html.topolino.controllers;
import java.io.IOException;
import java.text.ParseException;
import org.html.topolino.model.Issue;
import org.html.topolino.parser.HTMLParser;
import org.html.topolino.services.IssueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/topolinoRest")
public class IssueController
{
@Autowired
private IssueService issueService;
@RequestMapping(value = "/saveAllIssues/", method = RequestMethod.GET)
public void saveAllIssues()
{
/* mapping dell'HTML nel Document */
Integer issueNumber = 1210;
try
{
Issue issue = HTMLParser.getIssueData(issueNumber);
issueService.addIssue(issue);
}
catch (ParseException | IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我的服务:
package org.html.topolino.services;
import org.html.topolino.model.Issue;
import org.html.topolino.repositories.IssueRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.stereotype.Service;
@Service
public class IssueService
{
@Autowired
private IssueRepository issueRepository;
public void addIssue(Issue issue)
{
issueRepository.save(issue);
}
}
我的存储库:
package org.html.topolino.repositories;
import org.html.topolino.model.Issue;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface IssueRepository extends CrudRepository<Issue, Integer>
{
// public Optional<Issue> findById(Integer id);
}
最后,未找到的实体:
package org.html.topolino.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity(name = "Issue")
@Table(name = "Issue")
public class Issue implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 4829348412099252089L;
// @Id
// @GeneratedValue
// long id;
//
// @Column
@Id
private Integer progressiveNumber;
@ElementCollection
private List<String> publishers;
@Column
private Date publishingDate;
@OneToOne(mappedBy = "issue", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
private Cover cover;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "issue_stories")
private List<Story> listOfStories;
public Issue() {
super();
}
public Integer getProgressiveNumber() {
return progressiveNumber;
}
public void setProgressiveNumber(Integer progressiveNumber) {
this.progressiveNumber = progressiveNumber;
}
public List<String> getPublishers() {
return publishers;
}
public void setPublishers(List<String> publishers) {
this.publishers = publishers;
}
public Date getPublishingDate() {
return publishingDate;
}
public void setPublishingDate(Date publishingDate) {
this.publishingDate = publishingDate;
}
public Cover getCover() {
return cover;
}
public void setCover(Cover cover) {
this.cover = cover;
}
public List<Story> getListOfStories() {
return listOfStories;
}
public void setListOfStories(List<Story> listOfStories) {
this.listOfStories = listOfStories;
}
}
我在哪里弄错了?感谢帮助。
编辑:我添加了进口
解决方案
将实体类的包添加到@ComponentScan,即
@ComponentScan({"org.html.topolino.model"})
它应该工作。
推荐阅读
- mongodb - graphql.GraphQLSchema:使用什么类型的参数来获取查询以传递给 mongo db.collection.find 来解析查询
- flutter - 导航到新路线并处理之前的状态
- python - 从不从 1 月开始的每月值创建数据框
- .net - 在 xaml .NET FrameWork 中使用滚动条从 texbox 更改值
- python - 如何找到列表中最长的单词
- node.js - 用于节点 GPU 的 TensorFlow 不会释放内存
- c++ - 如何在 qgraphicsview 上同步滑块?
- html - 在离子 HTML 中将 div 定位在另一个 div 的右侧
- javascript - 拖放 HTML5
- javascript - Javascript 可拖动