Hibernate 5注释org.hibernate.MappingException:未知实体

时间:2016-06-13 12:56:52

标签: 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-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);
    }
}

Model对象是: -

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    //@GeneratorType()
    private int id;

    private String fistName;
    private String lastName;
    private String email;

    public Customer(String fistName, String lastName, String email) {
        this.fistName = fistName;
        this.lastName = lastName;
        this.email = email;
    }

    public Customer() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFistName() {
        return fistName;
    }

    public void setFistName(String fistName) {
        this.fistName = fistName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

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();
    }
}

1 个答案:

答案 0 :(得分:0)

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

  • 使用Configuration class
  • 的弃用方式
  • 使用MetadataSourcesServiceRegistryBuilder
  • 的新方法

尽量只使用这种方式:

@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();
}