【问题标题】:JPA OneToMany only persists oneJPA OneToMany 只保留一个
【发布时间】:2017-01-13 22:46:58
【问题描述】:

我有这个代码:

@Table(name = "Prize")    
public class Prize {
    @Id
    @Column(
        nullable = false,
        unique = true
    )
    private int id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @Fetch(FetchMode.JOIN) 
    private Set<TicketNumber> numbers;

}

@Table(name = "TicketNumber") 
public class TicketNumber {
    @Id
    @Column(
        nullable = false,
        unique = true
    )
    private int id;
}

这将创建一个名为 Prize_TicketNumber 的连接表,其中包含两个字段(Prize_id 和 TicketNumber_id),但是当我保存包含许多号码的奖品时,该表中只插入了一条记录。有谁知道为什么?

编辑:这是插入的代码。存储库是简单的 JpaRepositories。

Prize prize = prizeRepository.findById(prizeId);
if(prize == null) return;
List<TicketNumber> winners = ticketNumberRepository.findByPrizeId(fixedPrize.getId());
if (winners != null && !winners.isEmpty()) {
    for (TicketNumber winner : winners) {
        winner.setWinner(false);
        TicketNumber t = ticketNumberRepository.save(winner);
    }
    raffleNumberRepository.flush();
}
prize.getTicketNumbers().clear();
for (String ticketId : ids) {
    TicketNumber ticketNumber = ticketNumberRepository.findOne(ticketId);
    if (ticketNumber != null) {
        ticketNumber.setWinner(true);
        prize.getTicketNumbers().add(raffleNumber);
    }
}
prize.setNumbersAssigned(true);
prizeRepository.saveAndFlush(prize);

【问题讨论】:

  • 发布您的代码。插入 ma,y 个数字的代码,以及两个实体的完整代码。
  • 您是否尝试使用 List 而不是 Set ?也许你对equals有问题
  • 我敢打赌它也是 equals 和 hashCode
  • 我不认为它是等于和/或哈希码,因为该集合包含所有正确的对象,就在进行保存之前。 @JBNizet 我发布了插入的代码。实体没有更多代码,只有 getter 和 setter 以及无趣的东西。

标签: java hibernate jpa spring-data-jpa


【解决方案1】:

一对多关联不需要连接表。在一对多关联中,孩子应该持有父母的 id。

看起来您缺少孩子的父 ID,而休眠假设这是一个多对多关联,然后创建连接表。

【讨论】:

  • 没有。连接表是为单向一对多关联指定的默认映射,并且出于正当理由。无论如何,这并不能回答问题。
  • 你提到有一个很好的理由为一个多对多连接表 - 你能分享你的意见,为什么在这种情况下有一个额外的表是有益的?另外,我的建议是更改映射可能会解决问题,但我知道这可能并不完全清楚。
  • 如果它是单向的,这意味着多方不应该知道一方。在 many side table 中使用一列来实现这种关联会违背目的。
  • 有趣,我不确定我是否同意,但欣赏不同的观点。多对一关联不定义关系的方向性,而是定义不同实体之间的关系。一对多可以是单向的,也可以是双向的——这取决于您是否关心关联的“属于”或“拥有许多”部分。此外,从性能的角度来看,连接表肯定比直接关系更昂贵。
猜你喜欢
  • 1970-01-01
  • 2017-12-08
  • 2022-06-21
  • 1970-01-01
  • 2018-11-06
  • 2021-12-04
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多