Objek JAXB - kode hash dan yang setara

Kami memiliki aplikasi java besar yang sepenuhnya bekerja berdasarkan serialisasi JAXB. Server middleware melakukan semua akses db dan mengirimkan semua Objek data dalam objek JAXB dan membuat serial ke XML dan mengirimkan data ke UI (C#.Net).

Seringkali setelah data diisi dari akses db ke objek Java JAXB, saya harus melakukan beberapa pemrosesan seperti "mengurutkan kumpulan objek berdasarkan atribut", mencari rata-rata, melakukan beberapa perhitungan pada daftar objek di koleksi dll.

Masalah utama saya adalah, objek JAXB tidak memiliki kode sama dengan dan hash. Jadi yang saya lakukan adalah memindahkan semua data ke beberapa objek Data yang ditentukan pengguna di mana saya memiliki kode hash, sama dengan, bandingkanTo sehingga saya dapat melakukan semua operasi dalam koleksi dan kemudian menyalin ke objek JAXB. Saya pikir ini adalah biaya tambahan.

Pertanyaan:

1) apakah objek jaxb mendukung sama dengan /hashcode/ bandingkanTo - dapatkah saya menentukan ini dalam skema?

2) Adakah alternatif lain yang lebih baik?

Terima kasih.


person java_mouse    schedule 14.10.2011    source sumber


Jawaban (4)


sayangnya, jaxb tidak menyediakan ini secara langsung. Anda dapat menggunakan plugin ini, atau menulis plugin Anda sendiri untuk perilaku yang lebih dapat disesuaikan.

person jtahlborn    schedule 14.10.2011
comment
plugin telah mengubah lokasi: github.com/highsource/maven-jaxb2 -plugin/wiki/ - person WhiteKnight; 22.06.2016

Sepertinya Anda perlu menggunakan Collections.sort(list, Sebanding) untuk mencapai penyortiran yang Anda inginkan. Setara dan kode hash tidak akan membantu kasus yang Anda sebutkan karena kasus Anda bergantung pada perbandingan atribut tertentu, bukan objek secara keseluruhan.

Kasus lain dalam menemukan rata-rata dan melakukan penghitungan juga tidak ada hubungannya dengan kode sama dengan/hash yang dapat saya lihat. Operasi ini hanya memerlukan penguraian daftar dan menjalankan algoritma yang sesuai.

person Robin    schedule 14.10.2011
comment
Ini adalah ide bagus untuk menggantikan bandingkanTo. Tapi masalah saya bukan hanya penyortiran. Saya melakukan semua jenis pemrosesan seperti membuat pohon bersarang dari objek-objek ini di mana saya perlu meletakkannya di peta hash, dll. Saya perlu memiliki solusi untuk kode hash dan persamaannya juga; - person java_mouse; 14.10.2011
comment
Ini adalah skenario yang berbeda dari pertanyaan Anda yang sebenarnya. Anda juga harus mendefinisikan lebih lanjut persyaratan untuk pohon bersarang Anda yang menjelaskan perlunya mengganti kode sama/hash. Sejauh ini Anda mengatakan bahwa Anda perlu mengganti, tetapi belum memberikan alasan yang jelas mengapa. - person Robin; 14.10.2011

FWIW, meskipun kelas Java yang dihasilkan JAXB tidak akan memiliki kode sama dengan dan kode hash, Anda dapat menambahkan penggantian ini di kelas yang Anda tulis dengan anotasi JAXB - JAXB akan mengabaikan metode ini.

person Paul Jackson    schedule 23.10.2011
comment
Saya mungkin tidak jelas- Maksud saya bahwa kelas dengan anotasi juga dapat memiliki persamaan dan kode hash, bukan berarti persamaan dan kode hash dapat ditambahkan menggunakan anotasi. - person Paul Jackson; 24.10.2011

maven-jaxb2-plugin dapat menghasilkan kode hash dan metode yang sama dengan menggunakan pluginnya sendiri: org.jvnet.jaxb2_commons. Detail selengkapnya tentang konfigurasi dapat ditemukan di sini.

Bagian yang relevan dari pom.xml adalah sebagai berikut:

<project
  <!-- other configuration -->
  <dependencies>
    <!-- other dependencies -->
    <dependency>
      <groupId>org.jvnet.jaxb2_commons</groupId>
      <artifactId>jaxb2-basics</artifactId>
      <version>0.11.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.13.1</version>
        <executions>
          <execution>
            <id>generate</id>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <args>
            <arg>-XtoString</arg>
            <arg>-Xequals</arg>
            <arg>-XhashCode</arg>
          </args>
          <plugins>
            <plugin>
              <groupId>org.jvnet.jaxb2_commons</groupId>
              <artifactId>jaxb2-basics</artifactId>
              <version>0.11.0</version>
            </plugin>
          </plugins>
          <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
          <cleanPackageDirectories>true</cleanPackageDirectories>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
person WhiteKnight    schedule 22.06.2016