2015-10-02 24 views
2

以前的answer解釋說,Findbugz/Sonarqube警告Non-transient non-serializable instance field in serializable class其中可序列化類具有成員集合時,應該在內部使用具體類來固定,而在外部使用(不可序列化)接口。帶集合成員的可串行化JPA實體

1 public class SampleClass implements Serializable { 
2 
3 private static final long serialVersionUID = 1905162041950251407L; 
4 
5 private Set<Integer> mySet;  // Sonarqube error 
6 
7 private HashSet<Integer> myOtherSet; 
8 
9 } 

如果該類是一個JPA實體,我想使其可序列化,那麼該指導是否仍然適用?下面的示例...

1 @Entity 
2 @Inheritance 
3 @DiscriminatorColumn(name=「fooClass") 
4 @Table(name=「foo」, schema = 「bar」) 
5 public class SampleClass implements Serializable { 
6 // SNIP 
7 private static final long serialVersionUID = 1905162041950251407L; 
8 
9 @OneToMany (fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "parent") 
10 @MapKey(name = "index") 
11 private Map<String, Asset> myMap = new HashMap<>(); // Sonarqube error 
12 // SNIP 
13 } 

編輯1

要澄清的問題:我已經看到了(即使實體是可序列化) 使用採集接口而

  1. 幾乎所有的例子比混凝土構件,所以我不知道的是,在「JPA世界」的「正確」的做法。
  2. 當我改變行11 private HashMap<String, Asset> myMap = ...

,以避免FindBugz/Sonarqube警告我看到

Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: 
com.foobar.SampleClass.myMap 
    at org.hibernate.cfg.annotations.CollectionBinder.getCollectionBinder(CollectionBinder.java:324) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1723) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375) ~[hibernate-core-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1519) ~[hibernate-entitymanager-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193) ~[hibernate-entitymanager-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1100) ~[hibernate-entitymanager-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:282) ~[hibernate-entitymanager-3.6.10.Final.jar:3.6.10.Final] 
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:366) ~[hibernate-entitymanager-3.6.10.Final.jar:3.6.10.Final] 
    ... 40 

EDIT 2 現在,通過@Gimby我在收到提示後澄清問題後見 https://stackoverflow.com/a/8169702/449347

從t他鏈接的Hibernate要求

,所以我想這是簡單地從Sonarqube/FindBugz假陽性持久化集合值 字段必須聲明爲接口類型?

+0

我指的不是警告爲誤報。警告只是:警告。一種跡象表明某種事物有引起問題的合理可能性,但不具有保證。 – Gimby

回答

1

如在上面的問題在EDIT 2描述的,休眠3.6 JPA實現要求該持久集合值字段被聲明爲接口類型。

所以這是從靜態代碼分析工具,假陽性。