使用 spring 数据保存嵌套对象 - 使用 id 作为参考

Con*_*asy 7 java jpa spring-data-jpa

假设您正在创建类型为 的新实体,假设您知道ID 为 1 的a存在,那么UserUser 具有嵌套对象,是否有一种简单的方法可以在 new和 existing之间形成关联?BillingBillingUserBilling

假设获取一个Billing对象设置给用户是一个昂贵的操作,因此获取整个 Billing 对象并将其设置给用户的解决方案不是一个选项。

我的问题是,是否有使用 spring 数据保存实体与其嵌套对应物之间的这种关系的快捷方法?

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int userId;

    private String name;

    @ManyToOne
    @JoinColumn(name = "billing_id")
    private Billing userBill;

    // constructor
    // getters and setters

}
Run Code Online (Sandbox Code Playgroud)

例如在 sudo 代码中:

User bob = new User();
bob.billingId.id = 1;

userRepository.save(bob);
Run Code Online (Sandbox Code Playgroud)

cri*_*zis 10

绝对地。

JpaRepository.getOne(id)(与CrudRepository.findById) 将在EntityManager.getReference(entityType, id)内部调用,这是指定用于处理此确切用例的方法(获取对实体的引用,而不加载其关联状态)。

要回答您的问题,您想要的是:customer.setBilling(billingRepository.getOne(billingId))

  • @roberttrudel 不。添加“EntityManager.getReference()”的 javadoc:“如果数据库中不存在请求的实例,则首次访问实例状态时会抛出 EntityNotFoundException。(当调用 getReference 时,允许持久性提供程序运行时抛出 EntityNotFoundException。)”。TL;DR `getOne()` 的结果永远不会是 `null` (3认同)