2014-11-25 4 views
0

У меня есть класс, который реализует интерфейс. Почему содержимое arraylist не хранится в базе данных? Вот несколько примеров, чтобы проиллюстрировать проблему.Morphia: наследование не обрабатывается должным образом?

Класс

@Entity 
public class MyClass implements MyInterface { 

@Id 
@Indexed 
public String id; 

public String someField; 

public MyClass(String id, String someField){ 
    this.id = id; 
    this.someField = someField; 
} 
} 

Интерфейс

public interface MyInterface { 

@Embedded 
public List<String> mylist = new ArrayList<String>(); 
} 

Код испытания

@Test 
public void test() { 
    testInheritance(); 
} 

public void testInheritance() { 
    MyClass myClass = new MyClass("test", "someField"); 
    myClass.myList.add("wow"); 
    MyClassDao dao = new MyClassDao(); 
    dao.save(myClass); 
} 

public class MyClassDao extends BasicDAO<MyClass, ObjectId> { 

    public MyClassDao() { 
     super(MyClass.class, MorphiaManager.getMongoClient(), MorphiaManager.getMorphia(), MorphiaManager.getDB().getName()); 
    } 
} 

Результат в БД

{ 
"_id" : "test", 
"className" : "gr.iti.mklab.simmo.util.MyClass", 
"someField" : "someField" 
} 

ответ

0

Интерфейсы могут объявлять только сигнатуры методов и константы (static final переменных). То, что вы хотите использовать, - это абстрактный базовый класс, из которого вы наследуете.

Дополнительных наблюдения из вашего кода:

  • id следует Ob типа ObjectId и автоматически проиндексирован, вам не нужно @Indexed
  • Атрибуты должны быть private или protected и вы должны предоставить геттеры и сеттеры для них
  • Вам нужен конструктор no-arg по умолчанию в вашем классе объектов
Смежные вопросы