【问题标题】:Spring JPA one-to-one mapping can allow to save more itemsSpring JPA 一对一映射可以允许保存更多项目
【发布时间】:2020-11-18 06:54:22
【问题描述】:

我是一对一的关系

@OneToOne(fetch = FetchType.LAZY) 
@JoinColumn( name = "address_id" )
private Address address;

@OneToOne(mappedBy = "address")
private Customer customer;

我可以添加多个地址。 例如

Customer c1 = new Customer();
Address address = new Address();
addressRepo.save(address);
Customre c2 = new Customer();
c1.setAddress(address);
customerRopesitory.save(c1);
c2.setAddress(address);
customerRopesitory.save(c2);

我想在添加 address2 但 jpa 允许时看到 throw。 我想在春季 jpa 级别阻止这个 我该怎么做?

【问题讨论】:

  • 你能分享一下 Customer 和 Address 类吗?
  • 其实这不是我的代码。我有一个问题,我写了同样的条件。这样我就没有课了

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


【解决方案1】:

我猜你的问题是“如何阻止两次使用相同的地址”并抛出异常。我认为您必须以编程方式检查此内容,例如Assert.isTrue(customerRepository.countByAddress(address) == 0)

【讨论】:

    【解决方案2】:

    如果您将连接列设置为唯一:

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "address_id", unique = true)
    private Address address;
    

    当您尝试保存分配有相同 address 实体的 c2 实体时,Hibernate 将抛出 DataIntegrityViolationException

    【讨论】:

    • 这个解决方案对我的问题没有影响
    • @YusufYalcin ...那么您应该添加一些有关您的确切案例的更多详细信息以及预期的输出,以便您获得更好的帮助。
    • 我改变了我的条件,我做了一对一的条件,没有关系。只需在客户类中保存地址 id,如 Long 值,我就完成了此列的唯一性。谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多