【问题标题】:Create new Entity Object in Spring Boot在 Spring Boot 中创建新的实体对象
【发布时间】: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?

【问题讨论】:

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


【解决方案1】:

无论你在做什么,在春天都是完全有效的。在您上面提供的示例中,我可以确定您希望您的实体类对象本身存储值。它绝对正确。 您必须使用 new 关键字来实现这一点。 如果您仍然不希望为您的实体创建新对象,您可以选择通过 Bean/POJO/VO 类并将您的实体对象映射到这些类。

但我仍然会告诉你,无论你做什么都很好。

实际上,您创建的对象是用于存储值的目的,而不仅仅是因为您的类中有一些方法,因此您必须创建 new 对象才能调用该方法(就像我们通常所做的那样java 项目)。在 Spring 中,由 @Autowired 注释处理以创建对象。 简单的例子是你将在你的服务类中自动连接你的存储库。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这对我来说听起来不错:您创建实体,然后请求存储库存储它。Spring 没问题。

    你检查过这个吗? :

    http://spring.io/guides/gs/accessing-data-jpa/

    玩得开心

    【讨论】:

    • 我查看了链接,我想我只是需要一些验证!谢谢!
    【解决方案3】:

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

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

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

    我希望这能让你更清楚,如果你有任何问题,请随时提问:)

    【讨论】:

    • 非常感谢!这很有帮助。
    猜你喜欢
    • 2017-09-05
    • 2021-07-16
    • 2021-08-23
    • 2017-03-20
    • 2021-09-15
    • 2015-07-02
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多