Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java位集保存到DB_Java_Jpa_Persistence_Bitset - Fatal编程技术网

将java位集保存到DB

将java位集保存到DB,java,jpa,persistence,bitset,Java,Jpa,Persistence,Bitset,使用JPA时,我希望能够将一个位集保存到DB中,并当然将其拉回来 假设我有: @Entity @Table(name = "myTable") public class MyClass { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "Object_Id") protected long id; @Column(name = "Tags") pro

使用JPA时,我希望能够将一个位集保存到DB中,并当然将其拉回来

假设我有:

@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()?),而且它是如何从DB加载回来的

你能帮我做这个吗


谢谢

默认情况下,JPA使用Java序列化来持久化未知的
可序列化的
类型的属性(这样您就可以将序列化表示存储为
字节[]

通常这不是您想要的,因为可以有更有效的方法来表示您的数据。例如,
位集
可以有效地表示为数字(如果其大小有限),或
字节[]
,或其他形式(不幸的是,
位集
不提供进行这些转换的方法,因此需要手动实现它们)

当您决定要在数据库中使用何种数据表示时,需要告诉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中)。这种方法允许您在不同的实体中重用类型转换逻辑

更有效的方法(使用
int
而不是
byte[]
)需要一个非常简单的自定义类:

@Entity
@Access(AccessType.FIELD)
public class SampleEntity {

    @Transient
    private IntBitSet isolationLevel = new IntBitSet(0);

    public static final int USER_BIT = 0;
    public static final int DEVICE_BIT = 1;
    // 2, 3, 4, ...

    public boolean isUserIsolated() {
        return isolationLevel.bitGet(USER_BIT);
    }

    public boolean isDeviceIsolated() {
        return isolationLevel.bitGet(DEVICE_BIT);
    }

    public void setUserIsolated(boolean b) {
        isolationLevel.bitSet(USER_BIT, b);
    }

    public void setDeviceIsolated(boolean b) {
        isolationLevel.bitSet(DEVICE_BIT, b);
    }

    @Access(AccessType.PROPERTY)
    @Column
    public int getIsolationLevel() {
        return isolationLevel.getValue();
    }

    public void setIsolationLevel(int isolationLevel) {
        this.isolationLevel = new IntBitSet(isolationLevel);
    }

    private static class IntBitSet {
        private int value;

        public IntBitSet(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public boolean bitGet(int i) {
            return ((value >> i) & 1) == 1;
        }

        public void bitSet(int i, boolean b) {
            if (b) {
                bitSet(i);
            } else {
                bitUnset(i);
            }
        }
        private void bitSet(int i) {
            value = value | (1 << i);
        }
        private void bitUnset(int i) {
            value = value & ~(1 << i);
        }
    }
}
@实体
@访问权限(AccessType.FIELD)
公共类抽样实体{
@短暂的
私有IntBitSet isolationLevel=新IntBitSet(0);
公共静态最终整数用户\u位=0;
公共静态最终整数设备\u位=1;
// 2, 3, 4, ...
公共布尔值isUserIsolated(){
返回isolationLevel.bitGet(用户位);
}
公共布尔值isDeviceIsolated(){
返回isolationLevel.bitGet(设备\位);
}
公共void setUserIsolated(布尔b){
isolationLevel.bitSet(用户位,b);
}
公共无效setDeviceIsolated(布尔b){
隔离级别。位集(设备_位,b);
}
@访问权限(AccessType.PROPERTY)
@纵队
public int getIsolationLevel(){
返回isolationLevel.getValue();
}
public void setIsolationLevel(int isolationLevel){
this.isolationLevel=新的IntBitSet(isolationLevel);
}
私有静态类IntBitSet{
私有int值;
公共IntBitSet(int值){
这个值=值;
}
public int getValue(){
返回值;
}
公共布尔比特(int i){
返回((值>>i)&1)==1;
}
公共无效位集(整数i,布尔值b){
如果(b){
位集(i);
}否则{
bitUnset(一);
}
}
专用无效位集(int i){

value=value |(1谢谢,这看起来是一个很有希望的答案:)