2016-04-06 4 views
11

Beachten Sie, dass dieser Code funktioniert mit einfachen Spring, aber nicht mit Spring Boot (v1.3.3), gibt es etwas, das ich vermisse, weil dies aus einer Feder-App importiert wird funktioniert. Der folgende Code ist vom Frühjahr Boot AppHibernate Feld Benennung Problem mit Spring Boot (Benennungsstrategie)

@Entity 
@Table(name="project") 
public class Project implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="id") 
    private int id; 

    @Column(name="teamId") 
    private int teamId; 

    //private String Rentabiliteit; 

    @Column 
    //@Index(name="IProject_status",columnNames="Status") 
    private String status; 

    @Column 
    //@Index(name="IProject_naam",columnNames="Naam") 
    private String naam; 
    //public Prototype m_Prototype; 
    //public Team m_Team; 

} 

SQL

CREATE TABLE IF NOT EXISTS `project` (
`id` int(11) NOT NULL, 
`teamId` int(11) DEFAULT NULL, 
`status` varchar(255) DEFAULT NULL, 
`naam` varchar(255) DEFAULT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=latin1; 

ERROR

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:   
Unknown column 'project0_.team_id' in 'field list' 

Editiert: Application.yml

spring: 

mvc: 
    view: 
    prefix: /WEB-INF/jsp/ 
    suffix: .jsp 

datasource: 
    url: jdbc:mysql://localhost:3306/oxyplast 
    username: oxyplastuser 
    password: oxyplastuserpw 

jpa: 
    properties: 
    hibernate: 
     current_session_context_class: org.springframework.orm.hibernate4.SpringSessionContext 
     namingStrategy: org.hibernate.cfg.DefaultNamingStrategy 
+0

Ich bezweifle, ob das Problem in dem Code Sie auf dem Laufenden. Kannst du den kompletten Stacktrace posten? –

+0

https://github.com/thibitus/SE4-Oxyplast/tree/master/OxyplastSpringBoot –

+0

@MadhusudanaReddySunnapu Das ist viel zu lange, aber ich habe das Problem verursacht –

Antwort

14

Frühlings-Boot bietet die ImprovedNamingStrategy als de Fehlerbenennungsstrategie, die Hibernate nach einer team_id-Spalte sucht (abgeleitet aus dem Feld int teamId). Da diese Spalte in Ihrer Tabelle nicht vorhanden ist, ist dies die Ursache des Fehlers. Aus der Hibernate-Dokumentation:

Ein verbesserten Strategie zu benennen, die eingebetteten Unterstrichen auf Groß- und Kleinschreibung Namen bevorzugt

Sie haben zwei Möglichkeiten bekommen:

  1. die Spaltennamen Geben Sie explizit als @Column(name="teamId"). Früher gab es in frühen Boot-Versionen eine bug, nicht mehr.

  2. Ändern der Namensgebung Strategie im Frühjahr Boot-Eigenschaften und melden Sie es den EJB3NamingStrategy zu verwenden, die nicht Camelcase konvertiert snake_case, aber hält es wie es ist.


aktualisieren

ab 1.4, weil der Schalter 5 Hibernate hat die Namensgebung Strategie SpringPhysicalNamingStrategy die should be very close-1,3 Standardwerte aktualisiert.

Siehe auch:

+0

Ich stellte die explizite Spalte Name, könnte es zugeordnet werden anders von hiberante? Gibt es eine Möglichkeit, dies zu sehen? –

+0

und in meiner application.yml gibt es diese Zeile –

+0

namingStrategy: org.hibernate.cfg.EJB3NamingStrategy –

-1

wenn Sie Uppercase in den Spaltennamen verwenden möchten Sie es auf diese Weise

@Column(name="\"teamId\"") 

private int teamId; 

Sie zwingen müssen verwenden müssen Hibernate selbst wenn es EJB3NamingStrategy oder ImprovedStrategyNaming verwendet.

+0

Immer noch der gleiche Fehler, das wird sehr seltsam –

+0

org.hibernate.cfg.EJB3NamingStrategy fügen Sie dies in Ihrer Anwendung .yml –

+0

könnten Sie bitte zeigen Sie alle sql Anfrage von Hibernate !!! –

0

Below Strategie funktionierte gut für mich

spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.DefaultComponentSafeNamingStrategy 
0

mit der späten Version:

spring-boot-starter-data-jpa: ➡ 1.5.2.RELEASE 
    hibernate-core:5.0.12.Final 

diese Klasse

PhysicalNamingStrategyStandardImpl 

Bedarf erweitert werden und zusätzliche Eigenschaften zu überwintern.

Hier ist eine vollständige Version

public class PhysicalNamingStrategyImpl extends PhysicalNamingStrategyStandardImpl implements Serializable { 

    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl(); 

    @Override 
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { 
     String nameModified; 
     // Do whatever you want with the name modification 
     return new Identifier(nameModified, name.isQuoted()); 
    } 

} 

    @Override 
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { 
     String nameModified; 
     // Do whatever you want with the name modification 
     return new Identifier(nameModified, name.isQuoted()); 
    } 

es verknüpfen wie dies getan werden, um zu überwintern soll, wenn die Datenquelle konfiguriert.

properties.put("hibernate.physical_naming_strategy", "my.Package.PhysicalNamingStrategyImpl"); 

hier ist eine vollständige Version der Datenquelle Config

import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Primary; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import javax.persistence.EntityManagerFactory; 
import javax.sql.DataSource; 
import java.util.HashMap; 
import java.util.Map; 


@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "entityManagerFactory", 
     basePackages = { "com.xxxxxx.repository" } 
) 
public class SharedDataSourceConfig { 

    @Value("${startup.ddl-auto}") 
    String hbm2ddl; 

    @Primary 
    @Bean(name = "dataSource") 
    @ConfigurationProperties("spring.datasource.shared") 
    public DataSource customerDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Primary 
    @Bean(name = "entityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
      EntityManagerFactoryBuilder builder, 
      @Qualifier("dataSource") DataSource dataSource) { 
     Map<String, Object> properties = new HashMap<String, Object>(); 
     properties.put("hibernate.hbm2ddl.auto", hbm2ddl); 
     properties.put("hibernate.physical_naming_strategy", "my.package.PhysicalNamingStrategyImpl"); 
     return builder 
       .dataSource(dataSource) 
       .packages(PackageScannerHelper.getPackagesToScan()) 
       .persistenceUnit("shared") 
       .properties(properties) 
       .build(); 
    } 

    @Primary 
    @Bean(name = "transactionManager") 
    public PlatformTransactionManager transactionManager(
      @Qualifier("entityManagerFactory") EntityManagerFactory 
        entityManagerFactory 
    ) { 
     return new JpaTransactionManager(entityManagerFactory); 
    } 
} 
Verwandte Themen