優雅な科学技術サマーキャンプの回顧-JPA



https://github.com/etff/jwp-qna/tree/etff
第2の任務はJPAの尊敬を運用することです
指定されたプロジェクトでは、
ドメインに移動します.複雑なオブジェクト間の関係をJPAでマッピングします.

個人的にはorElse(null)が好きではありません.nullを返すのは良いモードではないからです.今回はコメントでEntityNotFoundExceptionを知りました
エンディングがないことを明確に表現できてよかったと思います.

テスト中に値が入力されているかどうかを確認し、実際のデータベースに値が入力されているかどうかを確認する必要があります.
今回の開発では,階層テストを積極的に用いた.
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class AnswerRepositoryTest {
    private User user1 = new User("tester", "password", "tester", "[email protected]");
    private Question question1 = new Question("title", "content");
    private Answer answer1 = new Answer(user1, question1, "content");

    @Nested
    @DisplayName("save 메서드는")
    class Describe_save {

        @Nested
        @DisplayName("답변 정보가 주어지면")
        class Context_with_answer extends JpaTest {
            final Answer expected = answer1;

            @Test
            @DisplayName("답변을 저장하고, 답변 객체를 리턴한다")
            void it_saves_answer_and_returns_answer() {
                Answer actual = getAnswerRepository().save(expected);

                assertThat(actual).isEqualTo(expected);
            }
        }
    }
}
また、既存のコードでFixtureとして共有されているコードが削除された.テストのために事前に作成しておいたFixtureは便利ですが、後で管理ポイントになります.また,状態共有では副作用を考慮する.
今回のタスクでは,静的手法が有用な事例を見つけた.
出しゃばる
    public static DeleteHistory ofQuestion(Long contentId, User deletedBy) {
        return new DeleteHistory(ContentType.QUESTION, contentId, deletedBy);
    }

    public static DeleteHistory ofAnswer(Long contentId, User deletedBy) {
        return new DeleteHistory(ContentType.ANSWER, contentId, deletedBy);
    }
Javaオブジェクト向けタスクを行う際には,一級集合を用い,JPAにも適用した.
N:1の関係の集合を1レベルの集合として作成し、論理を分離してコードをきれいにします.
経歴
@Embeddable
public class Answers {
    @OneToMany(mappedBy = "question", cascade = CascadeType.ALL)
    private List<Answer> answers;

    protected Answers() {
        this.answers = new ArrayList<>();
    }

    public DeleteHistories delete(User loginUser) {
        DeleteHistories deleteHistories = new DeleteHistories();
        for (Answer answer : answers) {
            final DeleteHistory deleteHistory = answer.delete(loginUser);
            deleteHistories.addHistory(deleteHistory);
        }
        return deleteHistories;
    }

    public void add(Answer answer) {
        this.answers.add(answer);
    }

    public List<Answer> getAnswers() {
        return new ArrayList<>(answers);
    }
}
学識
  • GenerationType: https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html
  • EntityNotFoundException
  • JPA-CASCADE、永続的な移行