gpt4 book ai didi

java - 当 yml 文件包含 Object 且 Map 引用另一个对象时,fixtures loadModel 无法正确加载

转载 作者:行者123 更新时间:2023-11-30 11:47:38 27 4
gpt4 key购买 nike

初始化数据样本.yml

Book(a): &a
title: Play in Action
price: 30.00

Book(b): &b
title: Alice in Wonderland
price: 12.00

Person(b):
name: Bob Joe
ratings:
? *a: 8
? *b: 8

Person 的 Java 类定义

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Person extends Model
{
public String name;

// choice and importance score
@ElementCollection(targetClass=Integer.class)
@MapKeyClass(Book.class)
public Map<Book, Integer> ratings;
}

Fixture.loadModels("init-datasample.yml") 不加载上面定义的初始评级。我试着不放&a,&b,也没用。有人可以帮忙吗?

谢谢。

最佳答案

好的,解决了。想在这里分享。如果有人可以查看并认为值得提交 git 源代码,请帮助这样做。

问题是目前不支持嵌入式。所以 Fixtures 类中的 resolveDependencies 并没有解析定义的映射中的引用。

我目前的工作是扩展 Fixtures 类,并隐藏 loadModels 方法。和在

的代码块内
Fixtures.loadmodels(String name, Map<String, Object> idCache) {

... ...
if (f.getType().isAssignableFrom(Map.class)) {

/* new below */
ElementCollection ec = f.getAnnotation(ElementCollection.class);
MapKeyClass mkc = f.getAnnotation(MapKeyClass.class);
if (ec != null && mkc != null) {
Map mapper = (Map) objects.get(key).get(f.getName());
if (mapper == null) continue;
Class targetClass = ec.targetClass();
Class mapKeyClass = mkc.value();
Map<Object, Object> fieldValue = new HashMap();
for (Object k : mapper.keySet()) {
Object mapKey = retrieveObject(mapKeyClass, k, idCache);
Object targetValue = retrieveObject(targetClass, mapper.get(k), idCache);
fieldValue.put(mapKey, targetValue);
}
f.set(model, fieldValue);
} else {
f.set(model, objects.get(key).get(f.getName()));
}
}

... ...

}

/* new method below */
private static Object retrieveObject(Class targetClass, Object alias, Map<String, Object> idCache)
{
if (targetClass.isAssignableFrom(alias.getClass())) {
return alias;
}

Object targetValue = idCache.get(targetClass.getCanonicalName() + "-"+ alias);

if (targetValue != null) {
targetValue = Model.Manager.factoryFor(targetClass).findById(targetValue);
}else {
try {
targetValue = targetClass.getConstructor(String.class).newInstance(alias.toString());
} catch(Exception ex) {
ex.printStackTrace();
return null;
}
}

return targetValue;
}

关于java - 当 yml 文件包含 Object 且 Map 引用另一个对象时,fixtures loadModel 无法正确加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9232591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com