2015-10-02 2 views
2

В предыдущем answer объясняется, что предупреждение Findbugz/Sonarqube Non-transient non-serializable instance field in serializable class, где сериализуемый класс имеет коллекцию членов, должен быть зафиксирован с использованием конкретного класса внутри, при использовании интерфейса (несериализуемого) извне.Сериализуемая сущность JPA с членом коллекции

Поддерживает ли это руководство, если класс является сущностью 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 } 

EDIT 1

Для уточнения проблемы:

  1. Почти все примеры я видел (даже если Entity сериализуем) использование Коллекция интерфейсов, а чем конкретные участники, поэтому я задаюсь вопросом, что «правильный» подход в «мире 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 I см. на странице https://stackoverflow.com/a/8169702/449347 что

От lin к Hibernate требует, чтобы постоянные коллекции многозначных поля объявляются как тип интерфейса

, так что я предполагаю, что это просто ложноположительных от Sonarqube/FindBugz?

+0

Я не буду ссылаться на предупреждения как ложные срабатывания. Предупреждения таковы: предупреждения. Знак того, что что-то имеет разумную возможность вызвать проблемы, но не с гарантией. – Gimby

ответ

1

Как описано в EDIT 2 в вышеуказанном вопросе, реализация Hibernate 3.6 JPA требует, что постоянные поля, представляющие ценность, должны быть объявлены как тип интерфейса.

Итак, это ложноположительный инструмент для анализа статического кода.

Смежные вопросы