当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot中创建新实体对象

杭涵映
2023-03-14

我希望有人能为我在Spring Boot项目中对JPA实体的困惑提供一些帮助。我听说在Spring项目中不应该调用< code>new。我知道这是为了让Spring管理所有的bean,可以通过注入或通过应用程序上下文显式地获得bean。

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

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

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

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

    // Getters & Setters ...
}
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    User findByUsername(String username);
}
@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);
    }
}

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

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

共有3个答案

邰昀
2023-03-14

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

你检查过这个吗?:

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

玩得开心

何志业
2023-03-14

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

但我仍然会说,无论你做了什么,都是完全没问题的。

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

希望这有所帮助。

贲宜春
2023-03-14

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

当您想创建实体的新实例时,您可以调用new,因为这不需要由spring管理。您可以简单地使用自动连接存储库将其保存在数据库中。这也可以反过来,因为很明显,您需要自动连接存储库来检索实体。

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

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

 类似资料:
  • 我从数据库生成了一个实体类,@namedquerys注释中创建了一些可用的“默认”查询。因此,当我必须创建新的sql查询时,我只需编写@NamedQuery并用名称和新的sql查询填充参数。然而,我的问题是,我应该在(@namedquerys)中编写所有查询,除此之外,我是否需要在类中编写特定于该查询的新方法?

  • 我有一个用控制器、服务和存储库逻辑构建的客户实体。 我还有一个Address实体,只有一个简单的POJO和@OneTomany注释。 如果我用相同的地址属性发出两个POST请求--如果这些地址属性已经存在于数据库中,我如何告诉我的应用程序--阻止在数据库中添加新实体,而是返回已经存在的实体? 例如。员额请求: 这是获取所有客户时的结果: 这里是必要的信息(if)需要帮助我进行我的小项目。 cust

  • 我在代码优先的情况下使用EF,我有这样的模型: 我收到一个客户ID和一个产品ID列表。当产品在数据库中不存在时,我想添加它: 问题是EF试图级联更改并尝试插入一个新的对象,其ID与现有对象相同,因此失败。我如何解决这个问题? 这是插入方法:

  • 我是全新的MongoDB,所以很抱歉,如果这个问题是基本的。 我试图获得一个使用Java basic对象(POJO)的基本CRUD,但这段代码失败了。(正确的方法是什么?我认为可能接近这个): 这是我得到的信息:

  • Java类可以很容易地转换成实体。 对于实体转换,基本要求是 - 无参数构造函数 注解 在这里,我们将学习如何通过示例,学习将常规Java类转换为实体类 - 简单的一个学生类(Student),代码如下 - 上面的类是一个常规的java类,有三个属性: , 和 。要将此类转换为实体,请在此类中添加和注解。 - 这是一个标记注释,表明这个类是一个实体。这个注释必须放在类名称上。 - 此注释位于持有持