Java 使用Hibernate JPA在列中存储对象

Java 使用Hibernate JPA在列中存储对象,java,hibernate,serialization,orm,jpa,Java,Hibernate,Serialization,Orm,Jpa,是否可以仅使用一个表存储以下内容?现在,hibernate将要做的是创建两个表,一个用于家庭,一个用于人。我希望将familymembers对象序列化到数据库中的列中 @Entity(name = "family") class Family{ private final List<Person> familyMembers; } class Person{ String firstName, lastName; int age; } @Entity(

是否可以仅使用一个表存储以下内容?现在,hibernate将要做的是创建两个表,一个用于家庭,一个用于人。我希望将familymembers对象序列化到数据库中的列中

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

    private final List<Person> familyMembers;

}

class Person{

   String firstName, lastName;
   int age;

}
@Entity(name=“family”)
阶级家庭{
私人最终名单家庭成员;
}
班主任{
字符串firstName,lastName;
智力年龄;
}

您可以创建接受/返回序列化表单的伪属性(getter和setter),并使用
@Transient
注释
家族成员。这还需要为所有其他属性注释getter,而不是字段。

使用
@Column
注释属性,并将类型定义为
ArrayList
,而不仅仅是
List
。并使
Person
实现
可序列化


但是,只有在你的动机非常明确的情况下,你才应该这样做,因为在一些非常罕见的情况下,这是正确的解决方案。正如帕斯卡所指出的,如果你不得不改变人,你会头疼的

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

首先,您需要使用
byte[]
属性来保存将存储在数据库BLOB中的人员列表的序列化版本。因此,用
@Lob
注释它的getter(我会使getter和setter
私有化,以避免它们被公开)。然后,公开“假”getter和setter以从
字节[]
返回或设置
列表。我在下面的示例中使用from Commons Lang(如果您不想导入此库,请提供您自己的帮助器类)对
字节[]
进行动态序列化/反序列化。别忘了用
@transcenter
标记“假”getter,否则Hibernate将尝试创建一个字段(失败是因为它无法确定
列表的类型)

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

@Type(Type=“serializable”)
私人名单家庭成员;
如果无法使用hibernate批注,请尝试以下操作:

@Lob
private Serializable familyMembers;

public List<Person> getFamilyMembers(){
    return (List) familyMembers;
}

public void setFamilyMembers(List<Person> family){
    familyMembers = family;
}
@Lob
私有可序列化家庭成员;
公共列表getFamilyMembers(){
返回(列表)家庭成员;
}
public void setFamilyMembers(列表族){
家庭成员=家庭;
}

这还不清楚。如果您将family视为一组人,那么您需要为family创建一个新表,除非您使用简单类型(如整数或字符串)来表示family。OT:这将是一个糟糕的设计。如果一个家庭有3个成员,您希望在数据库列中看到什么值?我很确定这将失败对于
java.lang.ClassCastException:java.util.ArrayList不能转换为java.sql.Blob
是的,我查看了我的一个类,其中我遇到了相同的情况-它与OTU Lob一起工作,并指定了具体类型(ArrayList)。更新了答案是的,但这不是JPA注释。为什么不能使用database person,可能是因为使用它毫无意义?如果我只需要存储一个列表,我不需要将它放在单独的数据库中。
public class Person implements Serializable {

   private static final long serialVersionUID = 1L;

   // ...

   private String firstName, lastName;
   private int age;

}
@Type(type = "serializable")
private List<Person> familyMembers;
@Lob
private Serializable familyMembers;

public List<Person> getFamilyMembers(){
    return (List) familyMembers;
}

public void setFamilyMembers(List<Person> family){
    familyMembers = family;
}