将java BitSet保存到DB

使用JPA,我希望能够将BitSet保存到数据库并将其拉回到程序中.

假设我有

@Entity
@Table(name = "myTable")
public class MyClass {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Object_Id")
    protected long id;

    @Column(name = "Tags")
    protected BitSet tags;

... getters & setters etc...
}

还应该定义“columnDeFinition”吗?我真的不明白它是如何持久的(使用toString()?)而且它是如何从数据库中加载回来的.

你能帮帮我一下吗?

谢谢!

解决方法

认情况下,JPA使用Java序列化来保存未知Serializable类型的属性(以便将序列化表示存储为byte []).

通常它不是您想要的,因为可以有更有效的方式来表示您的数据.例如,BitSet可以有效地表示为数字(如果它的大小有界),或者byte [],或其他东西(遗憾的是,BitSet不提供进行这些转换的方法,因此您需要手动实现它们).

当您确定要在数据库中拥有哪些数据表示时,您需要告知JPA应用必要的转换.有两种选择:

>在getter和setter中实现转换.例如,如下:

@Entity
@Table(name = "myTable")
@Access(Accesstype.FIELD)
public class MyClass {
    ...
    @Transient // Do not store this field
    protected BitSet tags;

    @Access(Accesstype.PROPERTY) // Store the property instead
    @Column(name = "Tags")
    byte[] getTagsInDbRepresentation() {
        ... // Do conversion
    }

    void setTagsInDbRepresentation(byte[] data) {
        ... // Do conversion
    }
    ...
}

>使用特定于提供程序的扩展来隐式执行转换(例如,在Hibernate中为custom types).此方法允许您在不同实体中重用类型转换逻辑.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...