วัตถุ JAXB - แฮชโค้ดและเท่ากับ

เรามีแอปพลิเคชัน Java ขนาดใหญ่ที่ทำงานทั้งหมดโดยอิงจากการทำให้เป็นอนุกรมของ JAXB เซิร์ฟเวอร์มิดเดิลแวร์จะเข้าถึง db ทั้งหมดและส่งออบเจ็กต์ข้อมูลทั้งหมดในออบเจ็กต์ JAXB และซีเรียลไลซ์ไปยัง XML และส่งข้อมูลไปยัง UI ( C#.Net)

ส่วนใหญ่แล้วหลังจากที่ข้อมูลถูกเติมจากการเข้าถึง db ลงในวัตถุ JAXB java ฉันจะต้องประมวลผลบางอย่างเช่น "เรียงลำดับคอลเลกชันของวัตถุตามแอตทริบิวต์" ค้นหา avg ทำการคำนวณบางอย่างในรายการของวัตถุใน คอลเลกชัน ฯลฯ

ปัญหาหลักของฉันคือวัตถุ JAXB ไม่มีค่าเท่ากับและแฮชโค้ด ดังนั้นสิ่งที่ฉันกำลังทำคือการย้ายข้อมูลทั้งหมดไปยังวัตถุ Data ที่กำหนดโดยผู้ใช้ โดยที่ฉันมีรหัสแฮช เท่ากับ เปรียบเทียบเพื่อกำหนด เพื่อให้ฉันสามารถดำเนินการทั้งหมดในคอลเลกชันแล้วคัดลอกไปยังวัตถุ JAXB ฉันคิดว่านี่เป็นค่าใช้จ่ายเพิ่มเติม

คำถาม:

1) วัตถุ jaxb รองรับเท่ากับ /hashcode/ comparisonTo - ฉันสามารถระบุสิ่งเหล่านี้ในสคีมาได้หรือไม่

2) มีทางเลือกอื่นที่ดีกว่านี้อีกไหม?

ขอบคุณ.


person java_mouse    schedule 14.10.2011    source แหล่งที่มา


คำตอบ (4)


น่าเสียดายที่ jaxb ไม่ได้จัดเตรียมสิ่งนี้ไว้ทันที คุณสามารถใช้ ปลั๊กอินนี้ หรือเขียนของคุณเอง เพื่อปรับแต่งพฤติกรรมได้มากขึ้น

person jtahlborn    schedule 14.10.2011
comment
ปลั๊กอินมีการเปลี่ยนแปลงตำแหน่ง: github.com/highsource/maven-jaxb2 -ปลั๊กอิน/วิกิ/ - person WhiteKnight; 22.06.2016

ดูเหมือนว่าคุณจะต้องใช้ Collections.sort(list, เปรียบเทียบได้) เพื่อให้การเรียงลำดับที่คุณต้องการสำเร็จ เท่ากับและแฮชโค้ดจะไม่ช่วยกรณีใดกรณีหนึ่งที่คุณกล่าวถึง เนื่องจากกรณีของคุณอาศัยการเปรียบเทียบคุณลักษณะเฉพาะ ไม่ใช่วัตถุโดยรวม

กรณีอื่นๆ ของการค้นหาค่าเฉลี่ยและการคำนวณก็ไม่เกี่ยวข้องกับเท่ากับ/แฮชโค้ดที่ฉันเห็น การดำเนินการเหล่านี้จะต้องมีการแยกวิเคราะห์รายการและดำเนินการอัลกอริทึมที่เหมาะสมของคุณ

person Robin    schedule 14.10.2011
comment
นี่เป็นความคิดที่ดีที่จะแทนที่ comparisonTo แต่ปัญหาของฉันไม่ใช่แค่การเรียงลำดับเท่านั้น ฉันทำการประมวลผลทุกประเภท เช่น สร้างแผนผังที่ซ้อนกันของวัตถุเหล่านี้โดยที่ฉันต้องใส่ไว้ในแฮชแมป ฯลฯ ฉันจำเป็นต้องมีวิธีแก้ปัญหาสำหรับแฮชโค้ดและเท่ากับเช่นกัน - person java_mouse; 14.10.2011
comment
นี่เป็นสถานการณ์ที่แตกต่างจากคำถามจริงของคุณ คุณจะต้องกำหนดข้อกำหนดเพิ่มเติมสำหรับแผนผังที่ซ้อนกันของคุณซึ่งอธิบายความจำเป็นในการแทนที่เท่ากับ/แฮชโค้ด จนถึงตอนนี้คุณกำลังบอกว่าคุณต้องแทนที่ แต่ยังไม่ได้ให้เหตุผลที่ดีว่าทำไม - person Robin; 14.10.2011

FWIW แม้ว่าคลาส Java ที่สร้างโดย JAXB จะไม่มีค่าเท่ากับและแฮชโค้ด แต่คุณสามารถเพิ่มการแทนที่เหล่านี้ในคลาสที่คุณเขียนด้วยคำอธิบายประกอบ JAXB - JAXB จะเพิกเฉยต่อเมธอด

person Paul Jackson    schedule 23.10.2011
comment
ฉันอาจไม่ชัดเจน - ฉันหมายความว่าคลาสที่มีคำอธิบายประกอบสามารถมีค่าเท่ากับและแฮชโค้ดได้ ไม่ใช่ว่าเท่ากับและสามารถเพิ่มแฮชโค้ดได้โดยใช้คำอธิบายประกอบ - person Paul Jackson; 24.10.2011

maven-jaxb2-plugin สามารถสร้าง hashcode และวิธีเท่ากับโดยใช้ปลั๊กอินของตัวเอง: org.jvnet.jaxb2_commons ดูรายละเอียดเพิ่มเติมเกี่ยวกับการกำหนดค่าได้ที่นี่

ส่วนที่เกี่ยวข้องของ pom.xml มีดังนี้:

<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