>

JPA @Embeddable 를 사용하려고합니다 최대 절전 모드 엔터티와 포함 가능 개체에는 모두 id 라는 속성이 있습니다. :

@MappedSuperclass
public abstract class A {
    @Id
    @GeneratedValue
    long id;
}
@Embeddable
public class B extends A {
}
@Entity
public class C extends A {
    B b;
}

이것은 org.hibernate.MappingException: component property not found: id 를 일으킨다 .

@AttributeOverrides 사용을 피하고 싶습니다 . 따라서 spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.DefaultComponentSafeNamingStrategy 를 설정하려고했습니다.  (저는 Spring Boot를 사용하고 있습니다). 이것은 효과가 없었습니다 (같은 예외). 그러나 존재하지 않는 클래스를 지정해도 예외가 발생하지 않으므로 설정이 무시되고 있다고 의심됩니다.

이 변종에서도 이상한 것은

@Entity
public class C extends A {
    @Embedded
    @AttributeOverrides( {
        @AttributeOverride(name="id", column = @Column(name="b_id") ),
    } )
    B b;
}

여전히 같은 오류가 발생합니다.


  • 답변 # 1

    네이밍 전략 구성이 변경되었습니다. Spring Boot 문서에 따른 새로운 방법은 다음과 같습니다.

    spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
    
    

    또한 @Id 를 사용해서는 안됩니다   @Embeddable 내 . 따라서 별도의 @MappedSuperclass 를 만들었습니다.  임베드 가능 파일 :

    @MappedSuperclass
    public abstract class A {
        @Id
        @GeneratedValue
        long id;
    }
    @MappedSuperclass
    public abstract class E {
        @GeneratedValue
        long id;
    }
    @Embeddable
    public class B extends E {
    }
    @Entity
    public class C extends A {
        B b;
    }
    
    
    이 방법으로 테이블 C  두 개의 열이 있습니다  그리고 id . 단점은 물론 b_id 입니다  그리고 A  중복성을 소개하십시오. 이에 대한 DRY 접근 방식에 대한 의견은 매우 환영합니다.

    E

관련 자료

  • 이전 java - Windows 7의 시계 서비스가 작동하지 않습니다
  • 다음 multithreading - 세마포어를 복용하는 것은 원 자성이어야합니다 그렇습니까?