Как исправить гибернацию, дублирующую логические поля в Java

#hibernate #jpa #jaxb #jax-rs

#спящий режим #jpa #jaxb #jax-rs

Вопрос:

Я создал объект JPA для таблицы БД. Существует логическое поле «isPreferred». Если я получаю записи таблицы, у меня есть повторяющиеся поля в ответе. Один с «предпочтительным» = true и один с «isPreferred» = true. Я ожидаю только поля isPreferred. Как я могу решить эту проблему?

Я уже пробовал использовать класс-оболочку Boolean. Также пробовал использовать сеттер, такой как isPreferred и isIsPreferred / setPreferred и setIsPreferred.

 import javax.persistence.*;
import javax.xml.bind.annotation.XmlElement;

@Entity
public class Address {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String street;
  private String houseNr;
  private String zip;
  private String city;
  private String country;
  @XmlElement(name = "isPreferred")
  private boolean preferred;

  ...getters/setters...

  public boolean isPreferred() {
    return preferred;
  }

  public void setPreferred(boolean isPreferred) {
    this.preferred = isPreferred;
  }
}
  

Я ожидаю, что в моем ответе будет только одно логическое поле. Только поле «isPreferred»,
но на самом деле я получаю предпочтительный и isPreferred:

 "addresses": [
    {
        "zip": "12345",
        "country": "DEU",
        "city": "Köln",
        "street": "Hauptstr.",
        "isPreferred": true,
        "houseNr": "1",
        "type": "homeAddress",
        "preferred": true
    }
],
  

Комментарии:

1. Присутствует ли дублирующее поле в вашей базе данных? Это больше похоже на проблему сериализации JSON, чем на проблему сохранения. Тогда возникает вопрос: какова ваша библиотека сериализации JSON? Какую реализацию JAX-RS вы используете?

2. Попробуйте добавить @XmlAccessorType(XmlAccessType.FIELD) аннотацию перед вашим классом. Похоже @XmlAccessorType(XmlAccessType.PROPERTY) , в вашем случае по умолчанию используется значение по умолчанию, когда оно не указано. Также я совершенно уверен, что спящий режим здесь не является частью проблемы.

3. @XmlElement(name = "isPreferred") @Column(name = "preferred") private boolean isPreferred; /в качестве обходного пути могут использоваться / setter и getters isPreferred //

4. Привет, очень, очень редко (примерно <0,001%) вопросы связаны с jpa (или конкретной реализацией hibernate), JSF И jax-rs. Комбинация двух из них уже составляет менее 1%, поэтому, пожалуйста, попробуйте сузить проблему. И, скорее всего (поскольку вы «генерируете» XML / JSON, рамки для этого более актуальны. Пожалуйста, учитывайте все подобные вещи при добавлении тегов к вопросу.

Ответ №1:

На мой взгляд, у вас в основном есть два варианта:

  • Аннотируйте класс с помощью @XmlAccessorType(XmlAccessType.FIELD)
  • Поместите аннотацию @XmlElement(name = "isPreferred") в установщик поля

В настоящее время вы создаете второе поле с помощью средства получения.

Ответ №2:

Если я выполняю отладку в своем методе ответа, я вижу только одно поле, как и ожидалось, но в ответе postman у меня есть 2 логических поля: представление debugger с Response.ok(getAddresses()).build()

Комментарии:

1. Привет, вы можете (= должны) добавить это в качестве комментария к вопросу. Не в качестве ответа… Приветствия!