如何在Hibernate中映射第三方属性

如何在Hibernate中映射第三方属性,hibernate,oauth,annotations,spring-security,Hibernate,Oauth,Annotations,Spring Security,我有一个类(活动),它有一个字段(SignatureCret),该字段被定义为接口(SignatureCret),其实现(SharedConsumerSecret)来自Spring Security OAuth包 使用Hibernate持久化类的实例时,我希望使用SharedConsumerSecret的特定属性作为应从数据库保存/加载的值。我不能注释SharedConsumerSecret,因为它是Spring框架的一部分 有没有办法做到这一点 @Entity public class Act

我有一个类(活动),它有一个字段(SignatureCret),该字段被定义为接口(SignatureCret),其实现(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;
    ...
@实体
公共类活动实现了ConsumerDetails
{
@短暂的
私有列表权限=新建ArrayList();
私人消费市场;
私有字符串consumerName;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有整数id;
@许多酮
私人活动所有者活动所有者;
//这是个棘手的问题
私人签名秘密签名秘密;
@尺寸(最小值=1,最大值=36)
私有字符串uuid;
...
我能想到的唯一解决办法是让签名与活动之间建立一对一的关系,但这似乎有点愚蠢

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

您需要为SignatureCret实现UserType。它需要知道如何将对象转换为值(可能是字符串),以及如何将字符串转换为对象


有关如何构建用户类型,请参见Hibernate测试套件中的此示例:

除了实现用户类型之外,您还可以启用属性访问(在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);
    }

    ...
}