Как использовать поле базы данных int2 в качестве логического значения в Java с использованием JPA / Hibernate - PullRequest
1 голос
/ 10 мая 2010

Я пишу приложение на основе уже существующей базы данных (postgreSQL), используя JPA и Hibernate. В таблице есть столбец int2 (activeYN), который используется как логическое значение (0 => false (неактивно), а не 0 => true (активно)). В приложении Java я хочу использовать этот атрибут как логическое значение. Итак, я определил атрибут следующим образом:

@Entity
public class ModelClass implements Serializable {    
  /*..... some Code .... */
  private boolean active; 

  @Column(name="activeYN")
  public boolean isActive() {
    return this.active; 
  }
 /* .... some other Code ... */

}

Но есть исключение, потому что Hibernate ожидает логическое поле базы данных, а не int2. Могу ли я сделать это отображение в любом случае при использовании логического значения в Java ??

У меня есть возможное решение для этого, но мне не очень нравится: Мое "хакерское" решение таково:

@Entity
public class ModelClass implements Serializable {    
  /*..... some Code .... */
  private short active_USED_BY_JPA; //short because i need int2

  /**
   * @Deprecated this method is only used by JPA. Use the method isActive()
   */
  @Column(name="activeYN")
  public short getActive_USED_BY_JPA() {
    return this.active_USED_BY_JPA;
  }

  /**
   * @Deprecated this method is only used by JPA. 
   * Use the method setActive(boolean active)
   */
  public void setActive_USED_BY_JPA(short active) {
    this.active_USED_BY_JPA = active; 
  }

  @Transient //jpa will ignore transient marked methods
  public boolean isActive() {
    return getActive_USED_BY_JPA() != 0; 
  }

  @Transient
  public void setActive(boolean active) {
    this.setActive_USED_BY_JPA = active ? -1 : 0;
  }

 /* .... some other Code ... */

}

Есть ли другие способы решения этой проблемы?

Значение «hibernate.hbm2ddl.auto» в конфигурации hibernate установлено на «validate».

(извините, мой английский не самый лучший, надеюсь, вы все равно это понимаете) ..

Ответы [ 3 ]

2 голосов
/ 10 мая 2010

Ну, проблема в том, что int2 используется для хранения двухбайтового целого числа со знаком , независимо от того, как вы его используете, и Hibernate не знает вашей логики для перевода значения в boolean на уровне Java.

Таким образом, вам придется использовать ваше хакерское решение (т.е. прочитать столбец int2 в short и преобразовать его в вашу сущность), чтобы вы могли сделать вещи немного более сексуальными, перемещая аннотации к атрибутам:

@Entity
public class ModelClass implements Serializable {    
  /*..... some Code .... */

  @Column(name="activeYN")
  private short active; 

  public boolean isActive() {
    return this.active!=0; 
  }
 /* .... some other Code ... */

}

Или, если использование расширения JPA не является проблемой (JPA не поддерживает пользовательские типы), используйте пользовательский тип , который вы объявляете с аннотацией @Type:

@Entity
public class ModelClass implements Serializable {    
  /*..... some Code .... */
  private boolean active; 


  @org.hibernate.annotations.Type(type = "my.package.ShortToBooleanUserType")
  @Column(name="activeYN")
  public boolean isActive() {
    return this.active; 
  }
 /* .... some other Code ... */

}

Где ShortToBooleanUserType - это класс, который реализует org.hibernate.UserType или org.hibernate.CompositeUserType (см. Документацию) и выполняет преобразование в обоих направлениях.

1 голос
/ 24 декабря 2012

Вы также можете попробовать аннотацию, специфичную для Hibernate:

@Type(type = "numeric_boolean")
0 голосов
/ 10 мая 2010

Решение состоит в том, чтобы использовать пользовательский тип значения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...