Spring Hibernate 5 annotation org.Hibernate.MappingException:未知实体
我正在尝试将spring的最新版本与hibernate的最新版本集成。一切都是基于注释的。我得到一个例外:-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
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();
}