【发布时间】: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