220419~220420 TIL
18047 ワード
学習資料
Honoxの羽毛コード
学習のきっかけ
SpringDataJdbc oneToMany
create table if not exists article
(
id bigint primary key auto_increment,
author varchar(50)
);
create table if not exists comment
(
id bigint primary key auto_increment,
contents varchar(255),
// foreign key를 해당하는 table명으로 하는 것이 default이다.
article bigint references article(id)
);
public class Article {
@Id
private Long id;
private String author;
// article의 id를 가지는 comment들을 가져와 저장할 수 있도록 하는 set
private Set<Comment> comments;
public Article(String author, Set<Comment> comments) {
this.author = author;
this.comments = comments;
}
public Long getId() {
return id;
}
public String getAuthor() {
return author;
}
public Set<Comment> getComments() {
return comments;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", author='" + author + '\'' +
", comments=" + comments +
'}';
}
//CrudRepository를 활용
@Repository
public interface ArticleRepository extends CrudRepository<Article, Long> {
}
public class Comment {
@Id
private Long id;
private String contents;
public Comment(String contents) {
this.contents = contents;
}
public String getContents() {
return contents;
}
@Override
public String toString() {
return "Comment{" +
"id=" + id +
", contents='" + contents + '\'' +
'}';
}
setではなくListまたはMapを利用しますか?
// article의 의미를 더 명확하게 전달하기 위해서 article_id로 컬럼 네이밍 변경
// list활용을 위한 column article_key
create table if not exists comment
(
id bigint primary key auto_increment,
contents varchar(255),
article_id bigint references article(id),
article_key int
);
// list를 활용하는 버전
public class Article {
@Id
private Long id;
private String author;
// column 네이밍 설정을 위한 어노테이션, 왜인지는 모르겠으나 소문자로했을때 DbActionExecutionException 발생했다.
@MappedCollection(idColumn = "ARTICLE_ID")
private List<Comment> comments;
テストすると。
@DataJdbcTest
class ArticleRepositoryTest {
@Autowired
ArticleRepository articleRepository;
@Test
void save_find_Test() {
List<Comment> comments = List.of(new Comment("123"), new Comment("321"));
Article ron2Article = new Article("ron2", comments);
Article saved = articleRepository.save(ron2Article);
Article article = articleRepository.findById(1L).orElseThrow();
assertThat(article.getComments()).hasSize(2);
assertThat(article.getComments()).contains(new Comment("123"));
assertThat(article.getComments()).contains(new Comment("321"));
// 테스트를 위해서 Coment 객체의 equals 메서드를 contents만 같은지 확인하도록 overriding 했습니다.
}
TODO
OneToOne
・ManyToMany
・Embedded
関連の使い方は未整理.Reference
この問題について(220419~220420 TIL), 我々は、より多くの情報をここで見つけました https://velog.io/@cmsskkk/220420220421-TILテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol