Spring Hibernate 5 annotation org.Hibernate.MappingException:未知实体

Spring Hibernate 5 annotation org.Hibernate.MappingException:未知实体,spring,hibernate,spring-boot,annotations,Spring,Hibernate,Spring Boot,Annotations,我正在尝试将spring的最新版本与hibernate的最新版本集成。一切都是基于注释的。我得到一个例外:- Caused by: org.hibernate.MappingException: Unknown entity: com.example.model.Customer at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) ~[hibernate-core

我正在尝试将spring的最新版本与hibernate的最新版本集成。一切都是基于注释的。我得到一个例外:-

Caused by: org.hibernate.MappingException: Unknown entity: com.example.model.Customer
at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1447) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:100) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:678) ~[hibernate-core-5.0.0.Final.jar:5.0.0.Final]
我在StackOverflow检查了其他类似的问题,但没有一个解决方案对我有效。代码如下:-

@SpringBootApplication
@EnableTransactionManagement
public class SpringHibernateDemoApplication implements CommandLineRunner {

    public static void main(String[] args) {

        SpringApplication.run(SpringHibernateDemoApplication.class, args);
    }

    @Bean
    public DataSource dataSource() throws ClassNotFoundException {
        SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
         dataSource.setDriverClass((Class<? extends Driver>)Class.forName("com.mysql.jdbc.Driver"));
        //BasicDataSource dataSource = new BasicDataSource();
        //dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/customerDB");
        dataSource.setUsername("root");
        dataSource.setPassword("welcome");
        return  dataSource;
    }

    @Bean
    public SessionFactory createSessionFactory() throws ClassNotFoundException {
        Configuration configuration = new Configuration();
        configuration.addAnnotatedClass(Customer.class);

        Properties properties = new Properties();
        properties.put("hibernate.dialect","org.hibernate.dialect.MySQLDialect");
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.hbm2ddl.auto","update");

        configuration.setProperties(properties);


        StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();
        standardServiceRegistryBuilder.applySettings(configuration.getProperties());
        standardServiceRegistryBuilder.applySetting(Environment.DATASOURCE,dataSource());

        MetadataSources metadataSources = new MetadataSources(standardServiceRegistryBuilder.build());

        //metadataSources.addPackage("");
        return metadataSources.getMetadataBuilder().build().buildSessionFactory();

        //return metadataSources.getMetadataBuilder().build().getSessionFactoryBuilder().build();
    }

    @Bean
    public CustomerDao customerDao() {
        return  new CustomerDao();
    }

    @Bean
    public HibernateTransactionManager hibernateTransactionManager() throws ClassNotFoundException {
        return new HibernateTransactionManager(createSessionFactory());
    }

    @Override
    public void run(String... args) throws Exception {
        Customer customer = new Customer();
        customer.setFistName("Amar");
        customer.setLastName("Arya");
        customer.setEmail("amar@gmail.com");
        customerDao().saveCustomer(customer);
    }
}
DAO层是

public class CustomerDao extends AbstractDao<Customer> {

    public void saveCustomer(Customer customer) {
        save(customer);
    }
}

@Transactional
public abstract class AbstractDao<E> {

    @Autowired
    protected SessionFactory sessionFactory;

    public void save(E e) {
        saveEntity(e);
    }

    private void saveEntity(E e) {
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        session.save(e);
        transaction.commit();
    }
}
公共类CustomerDao扩展了AbstractDao{
公共作废保存客户(客户){
保存(客户);
}
}
@交易的
公共抽象类AbstractDao{
@自动连线
受保护的SessionFactory SessionFactory;
公共作废保存(E){
实体(e);
}
私有作废保存实体(E){
Session Session=sessionFactory.openSession();
事务=会话。beginTransaction();
会议.保存(e);
commit();
}
}

您混合了两种方法来配置会话工厂:

  • 使用
    配置
    类的不推荐方法
  • 使用
    MetadataSources
    ServiceRegistryBuilder
尝试仅在以下情况下使用新方法:

@Bean
public SessionFactory createSessionFactory() throws ClassNotFoundException {

    Properties properties = new Properties();
    properties.put("hibernate.dialect","org.hibernate.dialect.MySQLDialect");
    properties.put("hibernate.show_sql", "true");
    properties.put("hibernate.hbm2ddl.auto","update");

    StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();
    standardServiceRegistryBuilder.applySettings(properties);
    standardServiceRegistryBuilder.applySetting(Environment.DATASOURCE,dataSource());

    MetadataSources metadataSources = new MetadataSources(standardServiceRegistryBuilder.build());
    metadataSources.addAnnotatedClass(Customer.class);
    return metadataSources.getMetadataBuilder().build().buildSessionFactory();
}

这很有效!!!!谢谢。我还有一个问题。如何添加多个文件?addPackage(“packagename”)似乎不起作用。
@Bean
public SessionFactory createSessionFactory() throws ClassNotFoundException {

    Properties properties = new Properties();
    properties.put("hibernate.dialect","org.hibernate.dialect.MySQLDialect");
    properties.put("hibernate.show_sql", "true");
    properties.put("hibernate.hbm2ddl.auto","update");

    StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();
    standardServiceRegistryBuilder.applySettings(properties);
    standardServiceRegistryBuilder.applySetting(Environment.DATASOURCE,dataSource());

    MetadataSources metadataSources = new MetadataSources(standardServiceRegistryBuilder.build());
    metadataSources.addAnnotatedClass(Customer.class);
    return metadataSources.getMetadataBuilder().build().buildSessionFactory();
}