Как отобразить стороннюю собственность в Hibernate - PullRequest
0 голосов
/ 26 января 2011

У меня есть класс (Activity) с полем (signatureSecret), определенным как интерфейс (SignatureSecret), реализация которого (SharedConsumerSecret) происходит из пакета Spring Security OAuth.

При сохранении экземпляров моего класса в Hibernate я хочу использовать определенное свойство SharedConsumerSecret в качестве значения, которое должно быть сохранено / загружено из базы данных. Я не могу комментировать SharedConsumerSecret, так как он является частью среды Spring.

Есть ли способ сделать это?

@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 к Activity, но это кажется немного глупым.

Ответы [ 2 ]

0 голосов
/ 26 января 2011

Помимо реализации UserType, вы можете включить доступ к свойству (в JPA 1.0 - путем перемещения всех аннотаций к свойствам, в JPA 2.0 вы можете настроить тип доступа для отдельного свойства с помощью @Access) и реализовать логику преобразования в методах получения и установки :

@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);
    }

    ...
}
0 голосов
/ 26 января 2011

Я хочу использовать определенное свойство SharedConsumerSecret в качестве значения, которое должно быть сохранено / загружено из базы данных

Вам необходимо реализовать UserType для SignatureSecret. Он должен знать, как преобразовать объект в значение (возможно, строку) и как преобразовать строку в объект.

См. Этот пример из набора тестов Hibernate о том, как создать тип пользователя: https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/test/java/org/hibernate/test/annotations/entity/PhoneNumberType.java

...