2015-12-28 4 views
1

В классе модели у меня есть isActive поле with is boolean, которые представляют собой is_active поле в MySql DB. Вот весь модельный класс:Почему JPA Hibernate изменяет имя поля?

package ca.gatin.model; 

import java.util.Date; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "Account") 
public class Account { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(name = "first_name") 
    private String firstName; 

    @Column(name = "last_name") 
    private String lastName; 

    @Column(nullable = false, unique = true) 
    private String email; 

    @Column(nullable = false) 
    private String password; 

    @Column(name = "is_active", nullable = false) 
    private boolean isActive; 

    @Column(name = "date_created") 
    private Date dateCreated; 

    @Column(name = "date_last_modified") 
    private Date dateLastModified; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public boolean isActive() { 
     return isActive; 
    } 

    public void setActive(boolean isActive) { 
     this.isActive = isActive; 
    } 

    public Date getDateCreated() { 
     return dateCreated; 
    } 

    public void setDateCreated(Date dateCreated) { 
     this.dateCreated = dateCreated; 
    } 

    public Date getDateLastModified() { 
     return dateLastModified; 
    } 

    public void setDateLastModified(Date dateLastModified) { 
     this.dateLastModified = dateLastModified; 
    } 

} 

Но когда я принести счет, скажем, через REST API, как:

@RequestMapping(
     value = "/{id}", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
public ServiceResponse<Account> getAll(@PathVariable("id") Long id) { 
    ServiceResponse<Account> serviceResponse = accountService.getAccountById(id); 
    return serviceResponse; 
} 

В объекте ответ я получаю IsActive поле переименованы Hibernate к «активным», как это:

{ 
"id": 19, 
"firstName": "Julia", 
"lastName": "Sarandi", 
"email": "[email protected]", 
"password": "111111", 
"dateCreated": 1451293826000, 
"dateLastModified": null, 
"active": true 
} 

Почему? Почему все имена других полей остаются такими же, как в классе Account, но isActive переименовывается?

Это один вопрос, а другой вопрос не является: Я новичок в спящем режиме, и я не понимаю, почему в логах Hibernate DB запросов является показывают некоторые странные запросы:

языка
Hibernate: select account0_.id as id1_0_0_, account0_.date_created as date_cre2_0_0_, account0_.date_last_modified as date_las3_0_0_, account0_.email as email4_0_0_, account0_.first_name as first_na5_0_0_, account0_.is_active as is_activ6_0_0_, account0_.last_name as last_nam7_0_0_, account0_.password as password8_0_0_ from Account account0_ where account0_.id=? 

Что запрос является Это? Что такое символы: «0_», «0_0_». Могу ли я переключать журналы, чтобы показывать запросы MySQL, чтобы сделать их более понятными?

FYI В моих application.properties файл я следующие конфигурации:

spring.jpa.show-sql=true 
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy 
+1

вы цитируете некоторые JSON, но это не связано с Hibernate или JPA. Независимо от того, какую библиотеку JSON вы используете, это отвечает за это. Вы цитируете SQL-код, сгенерированный Hibernate ... и вы обнаружите, что другие поставщики JPA генерируют гораздо более читаемый SQL-код. –

+0

Что вы подразумеваете под «провайдерами JPA генерируют гораздо более читаемый SQL»? Где я могу обратиться к JPA? –

+0

Что я имею в виду? то, что я сказал. Если вы выполняете запрос JPQL (или команду JPA, например find), поставщик JPA преобразует его в SQL (как сообщит вам любая документация JPA). Спящий режим генерирует то, что вы видите там; по моему опыту, другие поставщики JPA генерируют более читаемый SQL, чем Hibernate. Вы можете легко проверить его, используя другой поставщик JPA. –

ответ

1

Это не имеет ничего общего с Hibernate, и все, что делать с JSON ИАС. Spring использует Jackson, и Джексон использует свойства bean (т. Е. Getters) для доступа к данным и преобразования их в поля JSON. Ваш получатель имеет имя isActive() и, следовательно, соответствует свойству bean с именем active, следовательно, имя атрибута в JSON.

Если вы хотите, чтобы поле JSON было названо isActive, тогда ваш геттер должен быть isIsActive(). Или намного лучше, вы должны аннотировать его @JsonProperty("isActive").

Чтобы ответить на ваш второй вопрос, запрос представляет собой SQL-запрос, сгенерированный Hibernate. Он изменяет имя таблиц и присваивает псевдонимы столбцам главным образом для устранения неоднозначности таблиц и полей разных таблиц, которые могут иметь одно и то же имя, AFAIK.

+0

Я аннотирую поле isActive в классе Account с @JsonProperty («isActive»), и теперь в ответе REST API я получаю два поля: {..., «active», : false, "isActive": false} –

+1

Что произойдет, если вы сделаете так, как я уже сказал, и аннотировать геттер, а не поле? –

+0

Yeap, это сработало.Теперь я вижу, что на самом деле происходит: когда я комментирую поле с помощью @JsonProperty («isActive»), он рассматривает его как «isActive», но в то же время геттер и setter все еще говорят JSON, что он «активен», поэтому Я просто сменил getter и setter на getIsActive() и setIsActive (..), и он сработал! И я удалил @JsonProperty .. Большое спасибо! –

1

Изменить геттер и сеттер имя метода для IsActive поля как:

public boolean getIsActive() { 
     return isActive; 
    } 

    public void setIsActive(boolean isActive) { 
     this.isActive = isActive; 
    } 

Затем он вернется IsActive в ответ.

+0

Спасибо! Работает на меня! –

+0

@RenatGatin приветствуется), это было полезно, вы можете принять и перенести ответ –

Смежные вопросы