Spring Data Neo4j 4 и динамические свойства

В моем проекте Neo4j/SDN 4 у меня есть следующий объект:

@NodeEntity
public class Value extends BaseEntity {

    @Index(unique = false)
    private Object value;

    private String description;

...

}

Во время выполнения приложения я хочу иметь возможность добавлять новые динамические свойства в узел Value, например, value_en_US, value_fr_FR.

Сейчас я не знаю, какие именно свойства будут добавлены к конкретному узлу Value во время выполнения приложения, поэтому я не могу определить эти свойства в коде как отдельные поля в Value.

Существуют ли в SDN 4 какие-либо механизмы для определения этих свойств во время выполнения приложения? Мне нужно что-то похожее на DynamicProperties из SDN 3.


person alexanoid    schedule 23.05.2017    source источник


Ответы (2)


В SDN 4 такой функциональности нет, но она будет добавлена ​​в SDN 5 через аннотацию @Properties к Map.

Очень скоро он будет доступен для тестирования в снапшот-версии. Ознакомьтесь с этим коммитом, чтобы узнать больше.

person nmervaillie    schedule 23.05.2017
comment
Спасибо за Ваш ответ. Я с нетерпением жду начала переноса своего приложения на OGM3/SDN5. - person alexanoid; 23.05.2017

Вы также можете посмотреть этот ответ на аналогичный вопрос.

https://stackoverflow.com/a/42632709/5249743

Просто имейте в виду, что в этом ответе функция:

public void addAllFields(Class<?> type) {
    for (Field field : type.getDeclaredFields()) {
        blacklist.add(field.getName());
    }
    if (type.getSuperclass() != null) {
        addAllFields(type.getSuperclass());
    }
}

не является пуленепробиваемым. Во-первых, он не смотрит на аннотации @Property. Так что, если вы хотите пойти по этому пути, держите ухо востро.

«Улучшение» — это

public void addAllFields(Class<?> type) {
    for (Field field : type.getDeclaredFields()) {
        blacklist.add(findName(field));
    }
    if (type.getSuperclass() != null) {
        addAllFields(type.getSuperclass());
    }
}

private String findName(Field field) {
    Property property = field.getAnnotation(Property.class);
    if(property == null || "".equals(property.name())) {
        return field.getName();
    } else {
        return property.name();
    }
}

Но это, очевидно, не ищет аннотацию методов...

person Evan Jones    schedule 21.07.2017