2017-12-22 11 views
0

SpringDataJPA/Hibernate을 사용하여 @Id 세대에 동일한 사용자 정의 IdentifierGenerator을 사용하는 많은 엔티티가 있습니다.동일한 Custom ID Generator를 사용하여 여러 엔터티에 대해 @GenericGenerator 선언을 통합하는 방법은 무엇입니까?

예시 엔티티.

@Entity 
@Table(name = "CHAIRS") 
public class ChairEntity { 

    @Id 
    @GeneratedValue(generator = "myGenerator") 
    @GenericGenerator(strategy = "a.b.jpa.generator.MyGenerator", name = "myGenerator") 
    protected String id; 

    // rest of the entity 
} 

그러나 모든 엔터티의 모든 ID 필드에 대해 @GenericGenerator 복호화를 반복하고 싶지는 않습니다. 못생긴 하드 코드 된 전체 클래스 이름이 포함 된이 주석을 숨길 방법이 없습니까?

포스트 scriptum
내가 이전에 id 필드를 포함하는 BaseEntity 클래스와 @MappedSuperClass을 사용했지만, 때문에 몇 가지 기술적 인 이유로 나는 그런 슈퍼 클래스를 활용 포기했다. 분명히이 질문에 대한 가장 쉬운 해결책입니다. 내가 생각 해낸

답변

1

솔루션 내 모든 개체는 a.b.jpa.entity 받고, 자바 트릭, 그리고 a.b.jpa.generator 내 발전기 및 @GenericGenerator 직접 클래스를 사용할 수 있기 때문에, 나는 다음과 같은 내용 a.b.jpa.entity 패키지의 package-info.java을 만들어; 내 질문에 대한 완벽한 솔루션입니다 @GenericGeneratora.b.jpa.entity 아래의 모든 클래스를 주석

@GenericGenerator(strategy = "a.b.jpa.generator.MyGenerator", name = MyGenerator.generatorName) 
package a.b.jpa.entity; 

import org.hibernate.annotations.GenericGenerator; 
import a.b.jpa.generator.MyGenerator; 

. 기본적으로 모든 개체에 사용할 수 있도록 설정합니다.

코드 생성기;

public class MyGenerator implements IdentifierGenerator { 

    public static final String generatorName = "myGenerator"; 

    @Override 
    public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object object) throws HibernateException { 
     return GeneratorUtil.generate(); 
    } 
} 

및 다음 상태의 엔티티; 그 중 하나가 사용하고자하는 경우 내 모든 개체에 MyGenerator 세부 사항을 제공 이제 @GenericGenerator가 단일 위치에 정의 된 트릭을, 한

@Entity 
@Table(name = "CHAIRS") 
public class ChairEntity { 

    @Id 
    @GeneratedValue(generator = MyGenerator.generatorName) 
    protected String id; 

    // rest of the entity 
} 

, 그들은 단지 @GeneratedValue을 사용합니다.

1

또한 다음

@MappedSuperclass

@MappedSuperclass 
public abstract class BaseEntity { 

    @Id 
    @GeneratedValue(generator = "myGenerator") 
    @GenericGenerator(strategy = "a.b.jpa.generator.MyGenerator", name = "myGenerator") 
    protected String id; 

    // getters, setters here 

} 
사용할 수 있습니다, 당신의 엔티티를 확장 할 수 있습니다 : 나는 이전에이를 활용 한

@Entity 
@Table(name = "CHAIRS") 
public class ChairEntity extends BaseEntity { ... } 
+0

, 그리고 더 나은 해결책이 정확하지만 내 요구 사항 그런 슈퍼 클래스를 사용하지 않게했습니다. 나는이 질문을 수정했다. 그러나이 질문에 대한 대답은 더 넓은 범위에서 적절하다. –