Caused by: org.hibernate.MappingException: property mapping has wrong number of columns: Parent.child type: Child
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:497)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:270)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1360)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1851)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
    ... 23 more

1. 원인

2. 이유

연관관계의 주인(mappedBy)를 설정하지 않았기 때문이다.

양방향 매핑의 규칙: 연관관계의 주인
양방향 연관관계 매핑시 지켜야 할 규칙이 있는데 두 연관관계 중 하나를 연관관계의 주인으로 정해야 한다. 연관관게의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리(등록, 수정, 삭제)할 수 있다. 반면이 주인이 아닌 쪽은 읽기만 할 수 있다. - 자바 ORM 표준 JPA 프로그래밍, 181p.

3. 해결책

mappedBy 를 선언해주어 연관관계의 주인을 지정해주면 된다.


입출력 관련 데이터를 관리할 때 가장 신경쓰이는 요소중에 하나가 생성(생성자, 생성일시)과 최종수정(최종수정자, 최종수정일)이다.
JPA에는 Auditing 이라고 하여, 인터페이스로 선언된 기능을 구현해두면 자동으로 엔티티에 필요한 데이터를 입력하여 등록하는 작업을 JPA에서 처리해주는 것이 가능하다.

현재 프로젝트에서 SpringBoot를 사용중인데 설정과 관련된 부분들을 JavaConfig로 처리하다보니 이와 관련된 정보가 없다.
생각보다 설정이 간단하다.

● AuditableEntity

@MappedSuperclass
@EntityListeners(value = { AuditingEntityListener.class })
public class AuditableEntity extends AbstractAuditable<Member, Long> {
    private static final long serialVersionUID = 359326673134570560L;
}

● Auditing target Entity

@Entity
public class AuditingTargetEntity extends AuditableEntity {

}

● SpringSecurityAuditorAware

현재 프로젝트는 스프링시큐리티를 이용하여 접근제어를 하고 있다.

JPA에서 사용할 Auditor(현재 작업중인 대상)에 관한 정보를 가져오는 과정을 정의한 AuditorAware<T> 인터페이스를 이용하여 스프링시큐리티의 SecurityContextHolder에서 관련 사용자 정보를 가져오도록 구현한다.

public class SpringSecurityAuditorAware implements AuditorAware<Member> {
    @Override
    public Member getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (null == authentication || !authentication.isAuthenticated()) {
            return null;
        }
        return (Member) authentication.getPrincipal();
    }
}

● AuditingConfig 선언

@Configuration
@EnableJpaAuditing
public class AuditingConfig {
    @Bean
    SpringSecurityAuditorAware auditorAware() {
        return new SpringSecurityAuditorAware();
    }
}

● 정리

참 쉽죠?

● 참고


+ Recent posts