2011-01-26 3 views
0

인터페이스 (SignatureSecret)로 정의 된 필드 (signatureSecret)와 그 구현 (SharedConsumerSecret)이 스프링 보안 OAuth에서 온 클래스 꾸러미.Hibernate에서 써드 파티 (third-party) 속성을 매핑하는 방법

내 클래스의 인스턴스를 Hibernate로 유지할 때 SharedConsumerSecret이라는 특정 속성을 데이터베이스에서 저장 /로드해야하는 값으로 사용하려고합니다. Spring 프레임 워크의 일부이기 때문에 SharedConsumerSecret에 주석을 달 수는 없습니다.

이렇게 할 방법이 있습니까?

@Entity 
public class Activity implements ConsumerDetails 
{ 
    @Transient 
    private List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
    private String consumerKey; 
    private String consumerName; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    @ManyToOne 
    private ActivityOwner activityOwner; 
    //THIS IS THE TRICKY ONE 
    private SignatureSecret signatureSecret; 
    @Size(min = 1, max = 36) 
    private String uuid; 
    ... 

나는 활동에 SignatureSecrets의 일대일 관계를 가지고하는 것입니다 생각할 수있는이 주변에있는 유일한 방법,하지만 조금 바보 같다.

답변

0

나는 데이터베이스 당신은 SignatureSecret에 대한 UserType을 구현해야합니다

에서로드 저장해야합니다 값 /로 SharedConsumerSecret의 특정 속성을 사용하고 싶습니다. 객체를 값 (아마도 String)으로 변환하는 방법과 String을 객체로 변환하는 방법을 알아야합니다.

UserType을 구축하는 방법에 최대 절전 모드 테스트 스위트에서이 예를 참조하십시오 제외 https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/test/java/org/hibernate/test/annotations/entity/PhoneNumberType.java

0

을 UserType을 구현에서, 당신은 JPA 1.0의 속성 액세스를 (사용할 수 있습니다 - JPA 2.0에서 속성에 모든 주석을 이동을 @Access으로 개별 속성에 대한 액세스 유형을 구성하고 getter 및 setter에서 변환 논리를 구현할 수 있습니다.

@Entity public class Activity implements ConsumerDetails { 
    private SignatureSecret signatureSecret; 

    @Column(name = "sharedSecret") 
    public String getSecretAsString() { 
     return ((SharedConsumerSecret) signatureSecret).getConsumerSecret(); 
    } 

    public void setSecretAsString(String secret) { 
     signatureSecret = new SharedConsumerSecret(secret); 
    } 

    ... 
} 
관련 문제