繁体   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