@OneToOne или @ManyToOne для ссылок на неизвестную сущность - PullRequest
0 голосов
/ 30 января 2019

Простой сценарий:

  • . AdmisRejet может быть связан с Admis или PreCandidat.
  • Admis и PreCandidat могут иметь много AdmisRejet.

Все работало, когда у меня были только Admis и AdmisRejet.

Но затем я добавляю PreCandidat (так же, как Admis), я получаю ошибку гибернации.

Не могу выяснить, почему ...

Модель (все ониесть геттеры, сеттеры и идентификаторы):

// package nc.unc.importparcoursup.dao.admisDAO
@Entity
public class AdmisRejet {
    @ManyToOne
    @JoinColumn(name = "ADMIS_ID")
    private Admis admis;

    @ManyToOne
    @JoinColumn(name = "CAND_KEY")
    private PreCandidat preCandidatRejet;

// package nc.unc.importparcoursup.dao.admisDAO
@Entity
public class Admis {
    @OneToMany(mappedBy = "admis", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<AdmisRejet> admisRejet;

// package nc.unc.importparcoursup.dao.pgiCocktailDAO.entity
@Entity
public class PreCandidat {
    @OneToMany(mappedBy = "preCandidatRejet", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<AdmisRejet> admisRejet;

Конфигурация dao:

package nc.unc.importparcoursup.dao.admisDAO;


@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "parcoursupEntityManagerFactory", transactionManagerRef = "parcoursupTransactionManager")
public class ParcoursupDAOConfig {

    @Value("${datasource.parcoursup-admis.hibernate-hbm2ddl-auto}")
    private String ddlMode;

    @Value("${datasource.parcoursup-admis.jdbc.driverClassName:#{null}}")
    private String driver;


    @Bean
    public PlatformTransactionManager parcoursupTransactionManager() {
        return new JpaTransactionManager(Objects.requireNonNull(parcoursupEntityManagerFactory().getObject()));
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean parcoursupEntityManagerFactory() {
        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();

        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto", ddlMode);
        properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQL94Dialect");

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

        factoryBean.setDataSource(parcoursupDataSource());
        factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
        factoryBean.setPackagesToScan(ParcoursupDAOConfig.class.getPackage().getName());
        factoryBean.setJpaPropertyMap(properties);

        return factoryBean;
    }

    @Bean
    @ConfigurationProperties(prefix = "datasource.parcoursup-admis")
    public DataSource parcoursupDataSource() {
        if (driver != null) {
            return DataSourceBuilder.create()
                    .driverClassName(driver)
                    .build();
        }
        return DataSourceBuilder.create()
                .build();
    }
}

Ошибка:

Причина: org.hibernate.AnnotationException:@OneToOne или @ManyToOne в nc.unc.importparcoursup.dao.admisDAO.AdmisRejet.preCandidatRejet ссылается на неизвестную сущность: nc.unc.importparcoursup.dao.pgiCocktailDAO.entity.PreCandidat

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Ну, это потому, что вы говорите factoryBean, что ваши сущности находятся в пакете factoryBean.setPackagesToScan(ParcoursupDAOConfig.class.getPackage().getName());, который nc.unc.importparcoursup.dao.admisDAO.PreCandidat находится в пакете nc.unc.importparcoursup.dao.pgiCocktailDAO.entity ...

Попробуйте factoryBean.setPackagesToScan("nc.unc.importparcoursup.dao") или переместите конфигурацию вашего класса на более высокий уровень.

0 голосов
/ 31 января 2019

Я думаю, что вы можете забыть добавить аннотации @Table (name = "table_name") к сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...