簡體   English   中英

保存時子實體的外鍵未添加到父實體,一對一

[英]Foreign key of child not added to parent entity when saving, one-to-one

我有以下設置:

  • 微創 3.x
  • 爪哇 15

我正在嘗試更新的實體:

@Setter
@Getter
@Entity
@ToString
@Table(name = "single_choice_question")
public class SingleChoiceQuestion extends OrderedQuestion {
  @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
  private SingleAnswer answer;

  @Override
  public void answer(Answer answer) {
    if (answer instanceof SingleAnswer single) {
        this.answer = single;
    }
    throw new IllegalArgumentException("answer is not of SingleAnswer type");
  }
}

它的子實體我試圖作為上述實體的一部分堅持下去:

@Getter
@Setter
@Entity
@Table(name = "single_answer")
public class SingleAnswer extends Answer {
  @OneToOne private AnswerOption choice;
}

所有實體都繼承自:

@MappedSuperclass
public abstract class BaseEntity {

  @Id
  @GeneratedValue(generator = "system-uuid")
  @GenericGenerator(name = "system-uuid", strategy = "uuid2")
  @Column(updatable = false, nullable = false, length = 36)
  @Type(type = "pkg.UuidUserType") // Maps UUID to SQL VARCHAR.
  private UUID id;

  @Version
  @Column(nullable = false)
  private Integer version;
...
}

基本答案類:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Answer extends BaseEntity {

  @Column(nullable = false)
  private Boolean correct;

}

執行以下幾行:


@ReadOnly
public class MyService {

  @Transactional
  public <A extends AnswerDto> A answer(A dto, UUID question) {
    var answer = questionsMapper.toAnswer(dto);
    answer.setCorrect(isCorrect(dto, question));

    var orderedQuestion =
        orderedQuestionRepository
            .findById(question)
            .orElseThrow(() -> new NotFoundException("question", question));

    orderedQuestion.answer(answer, false);
    orderedQuestionRepository.saveAndFlush(orderedQuestion);

    return dto;
  }
}

預期行為:SingleAnswer 實例被持久化,其 FK 保存在問題的answer_id列中。

實際行為:SingleAnswer 實例被持久化,但其 FK 未保存在問題的answer_id列中。 它們沒有以任何方式連接,因此孤兒移除似乎也不起作用。

在檢查了 hibernate 的日志后,我可以看到它只執行insert而不執行和update問題。

另一個觀察結果是,當我刪除刷新時,孤兒刪除確實有效 - SingleAnswer不會持續存在,盡管 FK 情況仍未解決。

orderedQuestion.answer(answer);
orderedQuestionRepository.save(orderedQuestion);

我看不出這個非常基本的設置有什么問題,任何幫助將不勝感激。

SingleChoiceQuestion實體中包含指示外鍵的@JoinColumn注釋:

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "answer_id")
private SingleAnswer answer;

這個問題非常簡單,@ @ReadOnly在某個時候被某人偷偷溜進了班級級別,我沒有注意到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM