![](/img/trans.png)
[英]Detached persited parent entity when saving unidirectional one-to-one child entity
[英]Foreign key of child not added to parent entity when saving, one-to-one
我有以下設置:
我正在嘗試更新的實體:
@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.