我希望有人能进一步阐明我在 Spring Boot 项目中对 JPA 实体的困惑。我听说在 Spring 项目中永远不要调用 new
。我理解这是为了让 Spring 管理所有的 bean,并且可以通过注入(inject)或显式地通过应用程序上下文来获取 bean。
但是,我不清楚如何获得新的 JPA 实体。如果我有一个用 @Entity
注释的类和一个处理我的数据访问的存储库类,我如何在我的服务层中获取一个新的实体对象?
我在应用程序的主类中包含了 @EntityScan
,因此我假设 Spring 知道该实体。但是当我尝试通过 ApplicationContext 获取它时,会引发异常。这是有道理的,因为我不相信 @Entity
注释的类是 Spring Beans,而且我认为用 @Component
注释它也不正确。如有任何澄清,我们将不胜感激。
我目前正在使用 new
关键字并在服务层中自己创建实体对象。下面是一个非常简单的例子:
实体/用户.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);
}
}
我们可以假设还有一些其他 Controller 类会利用服务层。
在此示例中,我在服务类方法 createAndSaveUser
中显式调用了 new
关键字。这是正确的方法吗?还是我应该从 Spring 获取一些映射到我的 JPA 实体的原型(prototype) bean?
最佳答案
在 Spring ,您可以 Autowiring /注入(inject)您的 bean、组件或服务。但是,不应 Autowiring 实体,因为这些交互是通过您的存储库完成的。您的存储库可以 Autowiring 。
当您想创建实体的新实例时,您被允许调用new
,因为这不需要由spring 管理。您可以简单地使用 Autowiring 存储库将其保存在数据库中。这也适用于其他方式,因为显然您需要 Autowiring 的存储库来检索您的实体。
是的,你的方法是正确的。
我希望这能让你更清楚,如果你有任何问题,请随时提问:)
关于java - 在 Spring Boot 中创建新的实体对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52818595/