【问题标题】:Spring Data JPA save child without fetch the parentSpring Data JPA 在不获取父级的情况下保存子级
【发布时间】:2017-08-31 15:35:07
【问题描述】:

如果您知道父 ID,如何使用 Spring 数据 JPA 存储库保存子实体?

例如,如果我们有一对多的关系:

@Entity
public class Customer {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;
    @ManyToOne
    private CustomerCategory category;
}

@Entity
public class CustomerCategory {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
}

可以做这样的事情:

CustomerCategory someCategory = customerRepository.findOne(1L);// how to skip that line. The id should be enough. 
Customer cust = new Customer("Evgeni", "Dimitrov", someCategory);           
customerRepository.save(cust);

JPA 可以做load(只需创建一个代理并设置 ID)而不是“获取”(从数据库中选择)。 Spring Data JPA 有可能吗?

【问题讨论】:

  • 我注意到了你的评论。 “如何跳过该行。id应该足够了。”是什么意思?
  • @JunbangHuang 用例是我知道类别的id(在这种情况下为1)。 JPA 只需知道 id 就可以为客户生成所需的插入语句。在保存客户之前,不应要求执行 select 语句并获取客户类别。
  • 感谢您的澄清。我不认为有解决办法。是的,我们可以创建自定义存储库查询。问题在于 JPA 查询本身。 JPA 中没有 INSERT 语句。 JPA 中允许的唯一语句是 SELECT、UPDATE 和 DELETE。
  • 我认为这是可能的,但解决方案是一种 hack。如果你映射categoryId并将category的映射更改为insertable=false updatable=false,它可以工作,但是没有非常充分的理由我不会这样做。
  • 看起来像这样:@Column(name="category_id") private Long categoryId; @ManyToOne @JoinColumn(name="category_id", insertable=false, updateable= false private CustomerCategory category; PS:我没有用任何工具检查语法,所以可能需要一些改进

标签: java spring hibernate jpa spring-data


【解决方案1】:

忘记 ID。您现在处于 ORM 的对象级别(ObjectRelationMapping)。对象由其他对象组成。没有 ID。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
猜你喜欢
  • 2022-11-28
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多