【发布时间】:2019-03-19 23:47:22
【问题描述】:
我希望有人能进一步阐明我对 Spring Boot 项目中的 JPA 实体的困惑。我听说在 Spring 项目中永远不应该打电话给new。我知道这是为了让 Spring 管理所有的 bean,并且可以通过注入或显式通过应用程序上下文来获取 bean。
但是,我不清楚如何获得新的 JPA 实体。如果我有一个用@Entity 注释的类和一个处理我的数据访问的存储库类,我如何在我的服务层中获取一个新的实体对象?
我已经在我的应用程序的主类中包含了@EntityScan,所以我假设 Spring 知道该实体。但是当我尝试通过 ApplicationContext 获取它时,会引发异常。这是有道理的,因为我不相信 @Entity 注释的类是 Spring Bean,而且我认为用 @Component 注释它是不正确的。任何澄清将不胜感激。
我目前正在使用new 关键字并自己在服务层中创建实体对象。下面是一个非常简单的例子:
entities/User.java
@Entity
@Table(name = "users")
public class User {
@Id
private Long id;
private String username;
// Getters & Setters ...
}
repositories/UserRepository.java
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
User findByUsername(String username);
}
服务/UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void createAndSaveUser(String username) {
User user = new User();
user.setUsername(username);
userRepository.save(user);
}
}
我们可以假设还有一些其他的控制器类会利用服务层。
在本例中,我在服务类方法createAndSaveUser 中显式调用new 关键字。这是正确的方法还是我应该从 Spring 获取一些映射到我的 JPA 实体的原型 bean?
【问题讨论】:
-
这是一篇关于如何扫描组件的好书。 vogella.com/tutorials/Spring/article.html
-
太棒了,感谢您提供额外的文档,我会调查一下。
标签: java spring hibernate spring-boot spring-data-jpa