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

标签 java spring hibernate spring-boot spring-data-jpa

我希望有人能进一步阐明我在 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/

相关文章:

java - 无法从切换按钮到第二个 Activity 获取值

java.lang.IncompleteClassChangeError : Implementing class Error/Hibernate

java - Maven 中的依赖问题

java - HIbernate 标准别名未加入

java - OkHttp MockWebServer 重启时接受连接失败

java - 定期重新创建对象

java - 尝试 ConcurrentHashMap.get() 时出现 NullPointerException

java - 即使设置了 spring.expression.compiler.mode,Spring SpEL 也不会编译

java - Android - 刷新 AlertDialog 中的数据?

java - 如果 kafka 代理宕机,生产者需要更长的时间来抛出异常