2012-02-10 6 views
2

のinit-datasample.yml備品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 

@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; 
} 

のJavaクラス定義Fixture.loadModelsに(参照含まれている場合loadModelが正しくロードされません。 "init-datasample.yml")は、上記で定義した初期評価をロードしません。 &を&bに入れないようにしましたが、うまくいきませんでした。誰かが助けてくれますか?

ありがとうございます。

答えて

1

よろしくお願いします。ここで共有したいですか?誰かが見て、それが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; 
    } 
0

のコードブロック内で、誰かがあなたがIDSによってそれらを参照することができます(whitchは、例えば、以前の@OnApplicationStartにロードされた)既存のエンティティを参照したい:

フィクスチャ:

User(user01): 
    email: [email protected] 
    userGroup.id: ${models.UserGroup.getGroupForYml(models.UserGroup.GROUP_SALES)} 

のUserGroupモデル:

@Entity 
public class UserGroup extends Model { 

    public static final String GROUP_ADMIN = "admin"; 
    public static final String GROUP_CUSTOMER = "customer"; 
    public static final String GROUP_SALES = "sales"; 

    @OneToMany(mappedBy = "userGroup") 
    public List<User> userList; 

    @Column(name="groupId") 
    public String group; 

    /** 
    * Used in the yml fixtures 
    * @param group - the group id 
    */ 
    public static Long getGroupForYml(String group) { 
     UserGroup ug = UserGroup.find("byGroup", group).first(); 
     return ug.id; 
    } 
} 

ユーザモデル:

@Entity 
@Table(name = "users") 
public class User extends BaseModel { 
    publis String email; 

    @ManyToOne 
    public UserGroup userGroup; 
} 
関連する問題