1

ドメインオブジェクトからNeo4jがプロパティ値としてネイティブに保存できるものへの変換には、本当に奇妙な問題があります。テスト ケースとして、Joda の DateTime を使用します。そのタイプのオブジェクトは、非常に簡単に String または Long に変換できます。

DateTime から String への変換は、次のコードで問題なく機能します。

public class DateTimeToStringConverter implements Converter<DateTime, String> {

  @Override
  public String convert(DateTime source) {
    return source.toDateTimeISO().toString();
  }

}

プロパティがノードに表示されます。

Node[1] {
  '__type__' = '...', 
  'entityEditedAt' = '2012-12-28T12:32:50.308+01:00', 
  'entityCreatedAt' = '2012-12-28T12:32:50.297+01:00',
  ...
}

ただし、DateTime を Long として保存したい場合 (Cypher で時間でソートするのに便利です)、まったく機能しません。これが私のコンバーターです:

public class DateTimeToLongConverter implements Converter<DateTime, Long> {

  @Override
  public Long convert(DateTime source) {
      return source.toDateTimeISO().getMillis();
  }

}

プロパティはノードに保存されません。したがって、完全に欠落しています。例外はスローされません。変換コードがまったく呼び出されていないようです。

コンバーターは、コードベースの構成を使用して Spring Data にフックされます。

@Bean
public ConversionServiceFactoryBean conversionService() {
    Set converters = Sets.newHashSet();

    // These work!
    converters.add(new DateTimeToStringConverter());
    converters.add(new StringToDateTimeConverter());

    // These don't :-(
    //converters.add(new DateTimeToLongConverter());
    //converters.add(new LongToDateTimeConverter());

    ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
    bean.setConverters(converters);
    return bean;
}

手がかりはありますか?私の意見ではうまくいくはずなので、私はここでかなり迷っています...

編集Spring Data Neo4j のドキュメントで次のテキストを見つけました:

Spring 変換サービスを使用して文字列に変換可能なすべてのフィールドは、文字列として保存されます。

これは、文字列への変換のみがサポートされているということですか? これはかなり限定的なようです。

4

1 に答える 1

4

joda の DateTime プロパティを long として保存することを SDN に伝えます。

@NodeEntity
public class MyEntity {
    ...
    @GraphProperty(propertyType = Long.class)
    private DateTime timestamp;
    ....
}

次に、登録した DateTimeToLongConverter が起動します。

于 2013-01-18T14:48:16.210 に答える