2012-10-16 36 views
1

我正在使用Spring Data Commons - 1.4.0.RC1和Spring Data MongoDB - 1.1.0.RC1,在更新嵌入列表時遇到問題使用mongoTemplate.findAndModify()並沒有將「_class」值設置爲mongoTemplate.save()的文檔(具有相同的類層次結構),從mongodb讀取數據時會導致問題,因爲應用程序不知道要實例化哪個具體類對於該列表中的每個嵌入式文檔。SpringData Mongodb MongoTemplate.findAndModify沒有爲嵌入對象設置「_class」值

例如,我有一個學生班,一個學生已經註冊了數學,物理,計算機科學等學科。這不是我正在使用的領域,但應該足以證明問題。所以我會映射到一個「學生」收集的對象列表的Student類作爲嵌入文件和所有科目擴展主題超類,如下:

@Document 
public class Student { 

@Id 
private String identifier; 

private List<Subject> subjcts; 
} 

public abstract class Subject { 
// common properties and methods; 
} 

public class Maths extends Subject {} 

public class Physics extends Subject{} 

要創建一個學生並保存到數據庫中,我做

Student student = new Student(); 
student.setIdentifier(UUID.random().toString); 
student.addSubject(new Maths()); 
student.addSubject(new Physics()); 

mongoTemplate.insert(student); or mongoTemplate.save(student); 

以上將創建科目數學和物理是學生,因爲有一個額外的字段「_class」指定具體的類,以便它可以在從數據庫中提取被映射到正確的類嵌入文檔。

但是,如果現在我想更新的主題列表中,這是直觀像做mongoTemplate.findAndModify(the query, new Update().set("subject", newSubjects), Student.class);

但findAndModify似乎沒有經過類型映射器,用於設置科目「_class」因此會導致從數據庫讀回問題。

這是Spring Data中的一個bug嗎?我如何解決它?

任何指針將不勝感激。 謝謝。

回答

3

這是SpringData MongoDB的一個已知問題(https://jira.springsource.org/browse/DATAMONGO-392)。

現在我發現的唯一解決方法是爲內部文檔類創建特定的轉換器。

+0

感謝您的快速回復。我現在將爲嵌入式文檔創建一個轉換器,直到其固定。乾杯 –