1

我有一个持久的类:

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字段的错误(如果不是瞬态的)。

  • 或者我是否必须使他们相应的类可序列化?

做上述两种情况有什么影响?

4

2 回答 2

0

奇怪的是这 3 个类现在不能序列化了。毕竟,它们也是实体,那你为什么不让它们可序列化呢?如果你让它们瞬态,Hibernate 不会保存它们——我怀疑你会想要这样的行为,尤其是。在关键领域。

于 2013-09-27T08:50:36.923 回答
0

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

使字段瞬态

制作字段transient意味着它们应该在序列化中被忽略,我认为你不希望这样(因为它们包含在休眠映射文件中)。

来自 Java 语言规范,Java SE 7 版,第 8.3.1.3 节。瞬态字段:

变量可以被标记为瞬态的,以表明它们不是对象持久状态的一部分。

使类实现可序列化

NotifEventGroupEmailTmpltSmsTmplt应该实现Serializable-interface。实现Serializable其实什么都不做,它只是一个标记接口,用于通知用户该类可以被序列化。

于 2013-09-27T09:00:20.813 回答