アプリケーション・ロジックにサービスコールを使用し、code
フィールドを使用してA
とB
との間の関係を表現する必要がある場合。
A
をname
の部分で検索するクエリ方法を作成し、code
にします。
@Repository
public interface DocARepo extends MongoRepository<A, String> {
List<A> findByCodeStartsWith(String code);
}
新しいname
一部でcode
を更新A
ためのサービスメソッドを作成します。 name
を「車」から「車」に変更することを避けるためにはDELIMITER
が必要ですが、B
とname
の「カート」もあります。
@Service
public class DocAService {
public final String DELIMITER = "::";
@Autowired
private DocARepo aRepo;
public void updateNames(String prevName, String name) {
List<A> aList = docARepo.findByCodeStartsWith(prevName + DELIMITER);
for (A a : aList) {
String code = a.setCode(name + DELIMITER + a.getId());
}
aRepo.save(aList);
}
}
Mongo Lifecycle eventsを活用するBeforeSaveEvent
にリスナーを作成します。
@Component
public class DocBBeforeSave extends AbstractMongoEventListener<B> {
@Autowired
private DocBRepo bRepo;
@Autowired
private DocAService aService;
@Override
public void onBeforeSave(BeforeSaveEvent<Person> event) {
B b = event.getSource();
if (b.getId() == null) return; // new doc
B old = bRepo.findOne(b.getId());
if (!Objects.equals(old.getName(), b.getName()))
aService.updateNames(old.getName(), b.getName());
}
}
また、あなたはA
とB
との間の関係を作成するために@DBRef
を使用することができます。
@Document
public class A {
private String id;
@DBRef
@NotNull
private B b;
...
@Transient
public String getCode() {
return b.getName() + id;
}
}
次に、データベースがA
が検索されたときに熱心B
フェッチ、A
にB
への参照を格納し、code
はB
からname
の一過性となります。
私は値を追跡するために(私はJaversを使っています)、一時的なコードを作ることはできません。また、 'code'値の更新が必要なのでサービスができません。 '文書' b'が変化しています。 –
サービスコールは 'B'の' name'を更新し、前の 'name'を使って' A'をすべて探し出し、 'code'を更新します。それは要求されているものとどのように違うのですか? –
'B'のイベントがトリガされ、nameの値が変更された場合、データベースは自動的に' A'を更新しなければならないように自動的に 'A'の更新を行います。 –