在不可序列化的情况下,形成复合键的持久化类属性是否也需要可序列化或瞬态化?

时间:2013-09-27 07:14:34

标签: java hibernate serialization transient

我有一个持久的课程:

public class NotifEventGroupRel implements Serializable{

    private static final long serialVersionUID = 7616645672995663305L;
    private Long eventGroupId;
    private String eventName;

    private NotifEventGroup notifEventGroup; //// composite id property
    private EmailTmplt emailTmplt;   // composite id property
    private SmsTmplt smsTmplt;       // composite id property
 ....
}

其hbm.xml文件为:

<hibernate-mapping>
    <class name="NotifEventGroupRel" table="TBLMEVENTGROUPREL">
    <composite-id>
                <key-many-to-one name="notifEventGroup" class="NotifEventGroup" lazy="false" >
                    <column name="EVENTGROUPID" precision="20" scale="0" not-null="true" />
                </key-many-to-one>
                <key-property name="eventName" type="java.lang.String">
                    <column name="EVENT" />
                </key-property>
    </composite-id>
<many-to-one name="emailTmplt" class="EmailTmplt" lazy="false" not-null="false" >
            <column name="EMAILTMPLTID"></column>
        </many-to-one>
        <many-to-one name="smsTmplt" class="SmsTmplt" lazy="false" not-null="false">
            <column name="SMSTMPLTID" />
        </many-to-one>

    </class>
</hibernate-mapping>

形成复合id的属性类是:

public class NotifEventGroup {

        private Long eventGroupId;
        private String name;
.......
}


public class EmailTmplt {
    private Long emailTmpltId;
    private String name;
.....   
}

public class SmsTmplt {
    private Long smsTmpltId;
    private String name;
..........
}
  • 我是否需要暂时使用以下属性:

(如下所示)

private transient NotifEventGroup notifEventGroup; //// composite id property
private transient EmailTmplt emailTmplt;   // composite id property
private transient SmsTmplt smsTmplt;       // composite id property

因为findbug为字段提供了 Non-transient non-serializable instance field in serializable class 错误(如果是非瞬态的)。

  • 或者我必须使其相应的类可序列化吗?

上述两种情况的影响是什么?

2 个答案:

答案 0 :(得分:0)

奇怪的是,这3个类现在不可序列化。毕竟,它们也是实体,所以为什么不让它们可序列化呢?如果你让它们成为瞬态,Hibernate将无法保存它们 - 我怀疑你是否想要这样的行为,尤其是在关键领域。

答案 1 :(得分:0)

报告错误是因为实现Serializable的类中的所有字段也必须是Serializable

使字段瞬态

创建字段transient意味着它们应该在序列化中被忽略,我认为你不希望它(因为它们包含在hibernate-mapping文件中)。

从Java语言规范,Java SE 7 Edition, Section 8.3.1.3.瞬态字段:

  

变量可能被标记为瞬态,表示它们不属于对象的持久状态。

使类实现Serializable

课程NotifEventGroupEmailTmpltSmsTmplt也应该实现Serializable - 界面。实现Serializable实际上什么都不做,它只是一个标记界面,用于通知用户该类可以被序列化。