【问题标题】:How to map a third-party property in Hibernate如何在 Hibernate 中映射第三方属性
【发布时间】:2011-06-15 17:42:59
【问题描述】:

我有一个类 (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 与活动建立一对一的关系,但这似乎有点愚蠢。

【问题讨论】:

    标签: hibernate oauth annotations spring-security


    【解决方案1】:

    我想使用 SharedConsumerSecret 的特定属性作为应该从数据库中保存/加载的值

    您需要为 SignatureSecret 实现一个用户类型。它需要知道如何将对象转换为值(可能是字符串),以及如何将字符串转换为对象。

    请参阅 Hibernate 测试套件中有关如何构建用户类型的示例:https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/test/java/org/hibernate/test/annotations/entity/PhoneNumberType.java

    【讨论】:

      【解决方案2】:

      除了实现 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);
          }
      
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        相关资源
        最近更新 更多