java – 使用Hibernate JPA将对象存储在列中

前端之家收集整理的这篇文章主要介绍了java – 使用Hibernate JPA将对象存储在列中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以存储像以下使用只有一个表的东西?现在,hibernate会做的是创建两个表,一个用于Family,一个用于人.我希望将familymembers对象序列化到数据库的列中.
@Entity(name = "family")
class Family{

    private final List<Person> familyMembers;

}

class Person{

   String firstName,lastName;
   int age;

}

解决方法

这是一个可怕的设计,我真的不推荐它(你应该创建另一个表),但它是可能的.

首先,您需要使用byte []属性来保存数据库中存储在BLOB中的人员列表的序列化版本.所以用@Lob来注释它的getter(我会使getter和setter为private而不暴露它们).然后,暴露“假的”getter和setter返回或设置一个List< Person>从字节[].我在下面的示例中使用Commons Lang中的SerializationUtils(如果您不想导入此库,则提供您自己的帮助类),以便在/从byte []中实现序列化/反序列化.不要忘记用@Transcient或Hibernate标记“假的”getter将尝试创建一个字段(并且失败,因为它将无法确定列表的类型).

@Entity(name = "family")
class Family implements Serializable {

    // ...

    private byte[] familyMembersAsByteArray;

    public Family() {}

    @Lob
    @Column(name = "members",length = Integer.MAX_VALUE - 1)
    private byte[] getFamilyMembersAsByteArray() { // not exposed
        return familyMembersAsByteArray;
    }

    private void setFamilyMembersAsByteArray((byte[] familyMembersAsByteArray() { // not exposed
        this.familyMembersAsByteArray = familyMembersAsByteArray;
    }

    @Transient
    public List<Person> getFamilyMembers() {
        return (List<Person>) SerializationUtils.deserialize(familyMembersAsByteArray);
    }

    public void setParticipants(List familyMembers) {
        this.familyMembersAsByteArray = SerializationUtils.serialize((Serializable) familyMembers);
    }
}

不要忘记使Person类Serializable并添加一个真正的serialVersionUID(我只是在这里显示一个默认值):

public class Person implements Serializable {

   private static final long serialVersionUID = 1L;

   // ...

   private String firstName,lastName;
   private int age;

}

但是,让我坚持,这是一个可怕的设计,它将是非常脆弱的(改变的人可能需要“迁移”BLOB的内容,以避免反序列化问题,这将变得痛苦,你应该重新考虑这个想法,并使用另一个表的替代(或者我不明白为什么你使用数据库).

原文链接:https://www.f2er.com/java/121663.html

猜你在找的Java相关文章