2016-08-22 2 views
1

Я havgin проблема создания классов.Spring Hibernate добавление _ в запрос

Vehiculo (Vechicle)

import java.io.Serializable; 
import javax.persistence.*; 
import java.util.List; 


/** 
* The persistent class for the vehiculo database table. 
* 
*/ 
@Entity 
@Table(name="vehiculo") 
@NamedQuery(name="Vehiculo.findAll", query="SELECT v FROM Vehiculo v") 
public class Vehiculo implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private int idvehiculo; 
    private int capacidad; 
    private String matricula; 
    private int vacante; 
    private List<PersonaFisica> personaFisicas; 
    private TipoVehiculo tipoVehiculo; 

    public Vehiculo() { 
    } 


    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(unique=true, nullable=false, name= "idvehiculo") 
    public int getIdvehiculo() { 
     return this.idvehiculo; 
    } 

    public void setIdvehiculo(int idvehiculo) { 
     this.idvehiculo = idvehiculo; 
    } 


    @Column(nullable=false) 
    public int getCapacidad() { 
     return this.capacidad; 
    } 

    public void setCapacidad(int capacidad) { 
     this.capacidad = capacidad; 
    } 


    @Column(length=12) 
    public String getMatricula() { 
     return this.matricula; 
    } 

    public void setMatricula(String matricula) { 
     this.matricula = matricula; 
    } 


    @Column(nullable=false) 
    public int getVacante() { 
     return this.vacante; 
    } 

    public void setVacante(int vacante) { 
     this.vacante = vacante; 
    } 


    //bi-directional many-to-one association to PersonaFisica 
    @OneToMany(mappedBy="vehiculo") 
    public List<PersonaFisica> getPersonaFisicas() { 
     return this.personaFisicas; 
    } 

    public void setPersonaFisicas(List<PersonaFisica> personaFisicas) { 
     this.personaFisicas = personaFisicas; 
    } 

    public PersonaFisica addPersonaFisica(PersonaFisica personaFisica) { 
     getPersonaFisicas().add(personaFisica); 
     personaFisica.setVehiculo(this); 

     return personaFisica; 
    } 

    public PersonaFisica removePersonaFisica(PersonaFisica personaFisica) { 
     getPersonaFisicas().remove(personaFisica); 
     personaFisica.setVehiculo(null); 

     return personaFisica; 
    } 


    //bi-directional many-to-one association to TipoVehiculo 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="tipo_vehiculo_idTipoVehiculo", nullable=false, referencedColumnName="idTipoVehiculo") 
    public TipoVehiculo getTipoVehiculo() { 
     return this.tipoVehiculo; 
    } 

    public void setTipoVehiculo(TipoVehiculo tipoVehiculo) { 
     this.tipoVehiculo = tipoVehiculo; 
    } 

} 

VehicleType

import java.io.Serializable; 
import javax.persistence.*; 
import java.util.List; 


/** 
* The persistent class for the tipo_vehiculo database table. 
* 
*/ 
@Entity 
@Table(name="tipo_vehiculo") 
@NamedQuery(name="TipoVehiculo.findAll", query="SELECT t FROM TipoVehiculo t") 
public class TipoVehiculo implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private int idTipoVehiculo; 
    private String codigo; 
    private String descripcion; 
    private List<Vehiculo> vehiculos; 

    public TipoVehiculo() { 
    } 


    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(unique=true, nullable=false,name="idTipoVehiculo") 
    public int getIdTipoVehiculo() { 
     return this.idTipoVehiculo; 
    } 

    public void setIdTipoVehiculo(int idTipoVehiculo) { 
     this.idTipoVehiculo = idTipoVehiculo; 
    } 


    @Column(nullable=false, length=20) 
    public String getCodigo() { 
     return this.codigo; 
    } 

    public void setCodigo(String codigo) { 
     this.codigo = codigo; 
    } 


    @Column(length=140) 
    public String getDescripcion() { 
     return this.descripcion; 
    } 

    public void setDescripcion(String descripcion) { 
     this.descripcion = descripcion; 
    } 


    //bi-directional many-to-one association to Vehiculo 
    @OneToMany(mappedBy="tipoVehiculo") 
    public List<Vehiculo> getVehiculos() { 
     return this.vehiculos; 
    } 

    public void setVehiculos(List<Vehiculo> vehiculos) { 
     this.vehiculos = vehiculos; 
    } 

    public Vehiculo addVehiculo(Vehiculo vehiculo) { 
     getVehiculos().add(vehiculo); 
     vehiculo.setTipoVehiculo(this); 

     return vehiculo; 
    } 

    public Vehiculo removeVehiculo(Vehiculo vehiculo) { 
     getVehiculos().remove(vehiculo); 
     vehiculo.setTipoVehiculo(null); 

     return vehiculo; 
    } 

} 

Проблема, когда спящий режим пытается сделать запрос, он делает:

select vehiculo0_.idvehiculo as idvehicu1_25_, vehiculo0_.capacidad as capacida2_25_, 
     vehiculo0_.matricula as matricul3_25_, vehiculo0_.tipo_vehiculo_id_tipo_vehiculo as tipo_veh5_25_, 
     vehiculo0_.vacante as vacante4_25_ 
from vehiculo vehiculo0_ 

, как вы можете видеть, атрибут называется: tipo_vehiculo_idTipoVehiculo, но в запросе он продолжает добавлять «_», выглядя так: tipo_v ehiculo_id_tipo_vehiculo ....

Глядя в Интернете я видел, что я могу использовать новый NamingStrategy, чтобы избежать этой ситуации, класс я нашел это:

package net.petrikainulainen.hibernate.util; 
import org.hibernate.cfg.ImprovedNamingStrategy; 

/** 
* A custom naming strategy implementation which uses following naming conventions: 
* <ul> 
*  <li>Table names are lower case and in plural form. Words are separated with '_' character.</li> 
*  <li>Column names are lower case and words are separated with '_' character.</li> 
* </ul> 
* @author Petri Kainulainen 
*/ 
public class CustomNamingStrategy extends ImprovedNamingStrategy { 

    private static final String PLURAL_SUFFIX = "s"; 

    /** 
    * Transforms class names to table names by using the described naming conventions. 
    * @param className 
    * @return The constructed table name. 
    */ 
    @Override 
    public String classToTableName(String className) { 
     String tableNameInSingularForm = super.classToTableName(className); 
     return transformToPluralForm(tableNameInSingularForm); 
    } 

    private String transformToPluralForm(String tableNameInSingularForm) { 
     StringBuilder pluralForm = new StringBuilder(); 

     pluralForm.append(tableNameInSingularForm); 
     pluralForm.append(PLURAL_SUFFIX); 

     return pluralForm.toString(); 
    } 
} 

Но я не вижу где-нибудь о " _ ".. Я также пробовал добавить следующий код, чтобы посмотреть, работает ли он, но пока ничего.

 @Override 
     public String propertyToColumnName(String propertyName) { 
      // TODO Auto-generated method stub 
      return propertyName; 
     } 

     @Override 
     public String columnName(String columnName) { 
      // TODO Auto-generated method stub 
      return columnName; 
     } 

Я использую Hibernate + JPA, Spring с application.yml который выглядит следующим образом: и все возможные типы org.hibernate.dialect, но никаких результатов

spring: 
    datasource: 
    url: jdbc:mysql://localhost:3306/gotowork_db?useSSL=false 
    username: root 
    password: root 
    jpa: 
    show-sql: true 
    hibernate: 
     naming: 
     strategy: es.gfi.CustomNamingStrategy 
    properties: 
     hibernate: 
     dialect: org.hibernate.dialect.MySQLDialect 

Существует ли способ избежать изменения camelCap на «_» ??? ... и не изменять имена столбцов DB?

Благодаря

+0

попытка реализовать propertyToColumnName, а вы только переопределить класс метода таблицы – tonakai

ответ

0

Просто нашел проблему после нескольких часов тестирования является то, что стратегия именования используется, меняет все заглавные буквы для «_» + строчных при создании запроса.

Как вы можете видеть в коде в этом вопросе в

//bi-directional many-to-one association to TipoVehiculo 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="tipo_vehiculo_idTipoVehiculo", nullable=false, referencedColumnName="idTipoVehiculo") 
    public TipoVehiculo getTipoVehiculo() { 
     return this.tipoVehiculo; 
    } 

это делает: tipo_vehiculo_id_tipo_vehiculo, делая вид запроса, как:

SELECT 
    vehiculo0_.idvehiculo AS idvehicu1_25_, 
    vehiculo0_.capacidad AS capacida2_25_, 
    vehiculo0_.matricula AS matricul3_25_, 
    vehiculo0_.tipo_vehiculo_id_tipo_vehiculo AS tipo_veh5_25_, 
    vehiculo0_.vacante AS vacante4_25_ 
FROM 
    vehiculo vehiculo0_ 

так что я изменил на этом пути:

//bi-directional many-to-one association to TipoVehiculo 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="tipo_vehiculo_idtipovehiculo", nullable=false) 
    public TipoVehiculo getTipoVehiculo() { 
     return this.tipoVehiculo; 
    } 

Как вы можете видеть в названии, я удалил все верхние индексы ниже, а так как MySQL не чувствителен к регистру, это то же самое, хотя в таблице все его атрибуты используют заглавные буквы. Это происходит во всех класах, где имя в столбце @joincolumn. Создание спящего режима создать правильный запрос, чтобы он мог по казнены правильно:

SELECT 
    vehiculo0_.idvehiculo AS idvehicu1_25_, 
    vehiculo0_.capacidad AS capacida2_25_, 
    vehiculo0_.matricula AS matricul3_25_, 
    vehiculo0_.tipo_vehiculo_idtipovehiculo AS tipo_veh5_25_, 
    vehiculo0_.vacante AS vacante4_25_ 
FROM 
    vehiculo vehiculo0_ 
0

Попробуйте этот кусок кода, где в соответствии с вашим требованием вы можете сделать логическую проверку и, соответственно, заменить столбец имя текста.

public class Temp extends ImprovedNamingStrategy { 

    @Override 
    public String columnName(String columnName) { 
     if(columnName.contains("id_tipo_vehiculo")){ 
      String replacedString = columnName.replace("id_tipo_vehiculo", "idTipoVehiculo"); 
      return replacedString; 
     }else{ 
      return columnName; 
     } 
    } 

} 
+0

этот путь его просто удаление «_» от этой линии, и намного больше, что означает, что мне нужно будет добавить футляр и удалить его из каждой строки, в которую он добавит его. – user2690047

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