我在创建类时遇到问题。
车辆(车辆)
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;
}
}
车辆类型
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;
}
}
问题是,当 hibernate 尝试执行查询时,它会:
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_vehiculo_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更改为“_”???...并且不必更改数据库列名称?
谢谢
最佳答案
经过几个小时的测试后发现问题在于所使用的命名策略,在创建查询时将所有大写字母更改为“_”+小写。
正如您在问题中的代码中看到的
//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 中名称的所有类中。让 hibernate 创建正确的查询,以便它可以正确执行:
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_
关于java - Spring Hibernate 在查询中添加 _,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39075757/