簡體   English   中英

將 java BitSet 保存到 DB

[英]Saving java BitSet to DB

使用 JPA,我希望能夠將 BitSet 保存到 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()?),而且它是如何從數據庫加載回來的。

你能幫我解決這個問題嗎?

謝謝!

更有效的方法(使用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);
        }
    }
}

默認情況下,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 中的自定義類型)。 這種方法允許您在不同的實體中重用類型轉換邏輯。

你可以在getter方法中使用以下任何一種轉換

byte[] bytes = bitSet.toByteArray();
long[] longs = bitSet.toLongArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM