1

Spring Data Commons - 1.4.0.RC1 および Spring Data MongoDB - 1.1.0.RC1 を使用していますが、mongoTemplate.findAndModify() を使用して (同じクラス階層の) 埋め込みドキュメントのリストを更新する際に問題があります。 mongoTemplate.save() が行うように「_class」値を設定すると、mongodb からデータを読み取るときに問題が発生します。これは、アプリケーションがそのリストに埋め込まれた各ドキュメントに対してインスタンス化する具象クラスを認識していないためです。

たとえば、学生クラスがあり、学生は数学、物理学、コンピューター サイエンスなどの科目を履修しています。これは私が取り組んでいる分野ではありませんが、問題を実証するには十分なはずです。したがって、「学生」コレクションにマップされた 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 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」を設定するタイプ マッパーを通過していないように見えるため、db から読み戻す際に問題が発生します。

Spring Data のバグですか?どうすれば回避できますか?

任意のポインタをいただければ幸いです。ありがとうございました。

4

1 に答える 1

3

これは、SpringData MongoDB ( https://jira.springsource.org/browse/DATAMONGO-392 ) の既知の問題です。

今のところ、私が見つけた唯一の回避策は、内部ドキュメント クラス用の特定のコンバーターを作成することです。

于 2012-10-16T06:35:30.747 に答える