diff --git a/src/main/java/persistence/sql/dml/InsertQueryBuilder.java b/src/main/java/persistence/sql/dml/InsertQueryBuilder.java index a577286c..93221f7f 100644 --- a/src/main/java/persistence/sql/dml/InsertQueryBuilder.java +++ b/src/main/java/persistence/sql/dml/InsertQueryBuilder.java @@ -5,7 +5,6 @@ import persistence.sql.entity.EntityColumn; import persistence.sql.entity.EntityColumns; import persistence.sql.entity.EntityTable; -import persistence.sql.entity.OneToManyColumn; import java.lang.reflect.Field; import java.util.Arrays; @@ -30,18 +29,20 @@ private String columnsClause(EntityColumns entityColumns, Object parentEntity) { .collect(Collectors.toList()); if (parentEntity != null) { - OneToManyColumn oneToManyColumn = new OneToManyColumn(findOneToManyField(parentEntity.getClass())); - columns.add(oneToManyColumn.getForeignKeyColumnName()); + List oneToManyFields = findOneToManyFields(parentEntity.getClass()); + for (Field oneToManyField : oneToManyFields) { + EntityColumn oneToManyColumn = EntityColumn.from(oneToManyField); + columns.add(oneToManyColumn.getOneToManyColumn().getForeignKeyColumnName()); + } } return String.join(", ", columns); } - private Field findOneToManyField(Class clazz) { + private List findOneToManyFields(Class clazz) { return Arrays.stream(clazz.getDeclaredFields()) .filter(field -> field.isAnnotationPresent(OneToMany.class)) - .findFirst() - .orElseThrow(() -> new RuntimeException("OneToMany 필드를 찾을 수 없습니다.")); + .collect(Collectors.toList()); } private String valueClause(EntityColumns entityColumns, Object object, Long parentId) { diff --git a/src/main/java/persistence/sql/entity/EntityColumns.java b/src/main/java/persistence/sql/entity/EntityColumns.java index 7537a6dc..ec64c093 100644 --- a/src/main/java/persistence/sql/entity/EntityColumns.java +++ b/src/main/java/persistence/sql/entity/EntityColumns.java @@ -1,7 +1,5 @@ package persistence.sql.entity; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToMany; import jakarta.persistence.Transient; import java.lang.reflect.Field; @@ -27,14 +25,6 @@ public List getColumns() { return columns; } - public EntityColumn getEntityColumn(Field field) { - return columns.stream() - .filter(entityColumn -> entityColumn.getColumnName().equals(field.getName())) - .findFirst() - .orElse(null); - } - - public String getIdFieldName() { for (EntityColumn column : columns) { if (column.isPrimaryKey()) { diff --git a/src/main/java/persistence/sql/entity/OneToManyColumn.java b/src/main/java/persistence/sql/entity/OneToManyColumn.java index 7d8db8af..ca49685a 100644 --- a/src/main/java/persistence/sql/entity/OneToManyColumn.java +++ b/src/main/java/persistence/sql/entity/OneToManyColumn.java @@ -7,13 +7,15 @@ public class OneToManyColumn { private final Field field; + private Class joinEntityClass; public OneToManyColumn(Field field) { this.field = field; + this.joinEntityClass = (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; } public Class getJoinEntityClass() { - return (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; + return joinEntityClass; } public String getForeignKeyColumnName() { diff --git a/src/test/java/persistence/sql/entity/EntityPersisterTest.java b/src/test/java/persistence/sql/entity/EntityPersisterTest.java index ed67376e..daaf614e 100644 --- a/src/test/java/persistence/sql/entity/EntityPersisterTest.java +++ b/src/test/java/persistence/sql/entity/EntityPersisterTest.java @@ -86,10 +86,10 @@ void insert2() throws SQLException { List selectResult = jdbcTemplate.query(selectQuery, new EntityRowMapper<>(OrderItem.class)); assertThat(selectResult).hasSize(2); - assertThat(selectResult.get(0).getProduct()).isEqualTo(orderItem1.getProduct()); - assertThat(selectResult.get(0).getQuantity()).isEqualTo(orderItem1.getQuantity()); - assertThat(selectResult.get(1).getProduct()).isEqualTo(orderItem2.getProduct()); - assertThat(selectResult.get(1).getQuantity()).isEqualTo(orderItem2.getQuantity()); + assertThat(selectResult.get(0).getProduct()).isEqualTo("감자"); + assertThat(selectResult.get(0).getQuantity()).isEqualTo(3); + assertThat(selectResult.get(1).getProduct()).isEqualTo("고구마"); + assertThat(selectResult.get(1).getQuantity()).isEqualTo(1); jdbcTemplate.execute("drop table order_items"); jdbcTemplate.execute("drop table orders");