簡體   English   中英

形成復合鍵的持久類屬性是否還需要可序列化或在不可序列化的情況下是瞬態的?

[英]Do persistent class properties forming composite key also need to be serializable or transient in case of non-serializable?

我有一個持續的課程:

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錯誤中為我提供了Non-transient non-serializable instance field in serializable class字段(如果非瞬態)。

  • 還是我必須使其對應的類可序列化?

進行以上兩個案例中的任何一個有什么影響?

奇怪的是,這3個類現在無法序列化。 畢竟它們也是實體,所以為什么不將它們序列化呢? 如果使它們瞬變,則Hibernate將無法保存它們–我懷疑您是否會想要這種行為,尤其是。 在關鍵領域。

報告錯誤是因為實現Serializable類中的所有字段也必須是Serializable

使場瞬變

將字段設為transient意味着在序列化中應將其忽略,並且我認為您不希望這樣做(因為它們包含在hibernate-mapping文件中)。

摘自Java SE 7版 Java語言規范的第8.3.1.3。節。 瞬態場:

變量可以標記為瞬態,以指示它們不是對象持久狀態的一部分。

使類實現可序列化

NotifEventGroupEmailTmpltSmsTmplt也應實現Serializable SmsTmplt 實現Serializable實際上不執行任何操作,它只是一個標記接口,用於通知用戶該類可以序列化。

暫無
暫無

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

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