在 Spring Boot 中创建新的实体对象

Jon*_*nio 5 java spring hibernate spring-data-jpa spring-boot

我希望有人能更清楚地了解我在 Spring Boot 项目中对 JPA 实体的困惑。我听说永远不应该调用newSpring 项目。我理解这是为了让 Spring 可以管理所有的 bean,并且可以通过注入或显式地通过应用程序上下文来获取 bean。

但是,我不清楚如何获得新的 JPA 实体。如果我有一个注释的类@Entity和一个处理我的数据访问的存储库类,我如何在我的服务层中获取一个新的实体对象?

我已经包含@EntityScan在我的应用程序的主类中,所以我假设 Spring 知道该实体。但是当我尝试通过 ApplicationContext 获取它时,会引发异常。这是有道理的,因为我不相信带@Entity注释的类是 Spring Bean,而且我认为用@Component. 任何澄清将不胜感激。

我目前正在使用new关键字并在服务层中自己创建实体对象。一个非常简单的例子如下:

实体/用户.java

@Entity
@Table(name = "users")
public class User {
    @Id
    private Long id;
    private String username;

    // Getters & Setters ...
}
Run Code Online (Sandbox Code Playgroud)

存储库/UserRepository.java

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    User findByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)

服务/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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以假设还有一些其他的控制器类会利用服务层。

在此示例中,我显式调用new了服务类方法中的关键字createAndSaveUser。这是正确的方法还是应该从 Spring 获取一些映射到我的 JPA 实体的原型 bean?

Sve*_*ort 9

在 spring 中,您可以自动装配/注入 bean、组件或服务。然而,实体不应自动装配,因为这些交互是通过您的存储库完成的。您的存储库可以自动装配。

当您想创建实体的新实例时,您可以调用new,因为这不需要由 spring 管理。您可以简单地使用自动装配的存储库将其保存在数据库中。这也适用于其他方式,因为显然您需要自动装配的存储库来检索您的实体。

所以是的,你的方法是正确的。

我希望这对您来说更清楚,如果您有任何问题,请随时提问:)