首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@OneToOne或@ManyToOne引用springboot中来自不同应用程序和数据库的实体的未知实体

@OneToOne或@ManyToOne引用springboot中来自不同应用程序和数据库的实体的未知实体
EN

Stack Overflow用户
提问于 2022-11-16 10:10:56
回答 1查看 46关注 0票数 0

我正在为一个应用程序使用Springboot,该应用程序使用一些在另一个应用程序中管理并存储在另一个数据库中的类。我的Flight类是在本地数据库中的当前应用程序中管理的,它具有Aircraft类型的属性,该属性也在当前应用程序中定义,但在另一个应用程序中进行管理,并存储在另一个数据库中。

Flight类:

代码语言:javascript
运行
复制
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(schema = "app1")
public class Flight implements Serializable {
    @Id
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "flight_sequence"
    )
    @SequenceGenerator(
            name = "flight_sequence",
            allocationSize = 1
    )
    @Column(nullable = false, updatable = false)
    private Long id;

    private String callsign;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="aircraft_id", nullable=false)
    private Aircraft aircraft;
    private Date date;
    private Operator operator;
    private String origin;
    private String destination;
}

我的Aircraft课程:

代码语言:javascript
运行
复制
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(schema = "app2")
public class Aircraft implements Serializable {
    @Id
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "aircraft_sequence"
    )
    @SequenceGenerator(
            name = "aircraft_sequence",
            allocationSize = 1
    )
    @Column(nullable = false, updatable = false)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="operator_id", nullable=false)
    private Operator operator;
    private String registration;
    private String acType;
}

我在FlightRepository中编写了一个Jpa查询,它使用Flight类的Aircraft属性中的registration属性作为参数:

代码语言:javascript
运行
复制
public interface FlightRepository extends JpaRepository<Flight, Long> {
    Flight findFirstByDestinationAndAircraftRegistrationOrderByDateDesc(String destination, String registration);
}

但这会导致以下例外情况:

代码语言:javascript
运行
复制
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.student.application.domain.app1.Flight.aircraft references an unknown entity: com.student.application.domain.app2.Aircraft
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:100)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1750)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1694)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
    ... 86 more

如果我向@OneToMany类添加了一个Aircraft注释,那么问题仍然是一样的。如果同时删除@OneToMany@ManyToOne注释,就会得到Cannot join to attribute of basic type异常。

以下是两个数据库的配置类:

代码语言:javascript
运行
复制
@Configuration
@PropertySource({"classpath:application.properties"})
@EnableJpaRepositories(
        basePackages = "com.student.application.repository.app1",
        entityManagerFactoryRef = "app1EntityManager",
        transactionManagerRef = "app1TransactionManager")
public class App1DBConfiguration {
    @Autowired
    private Environment env;

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource app1DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean app1EntityManager() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(app1DataSource());
        em.setPackagesToScan(
                "com.student.application.domain.app1");

        HibernateJpaVendorAdapter vendorAdapter
                = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto",
                env.getProperty("spring.jpa.hibernate.ddl-auto"));
        properties.put("hibernate.dialect",
                env.getProperty("spring.jpa.properties.hibernate.dialect"));
        properties.put("hibernate.dialect.storage_engine",
                env.getProperty("spring.jpa.properties.hibernate.dialect.storage_engine"));
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Primary
    @Bean
    public PlatformTransactionManager app1TransactionManager() {
        JpaTransactionManager transactionManager
                = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                app1EntityManager().getObject());
        return transactionManager;
    }
}
代码语言:javascript
运行
复制
@Configuration
@PropertySource({"classpath:application.properties"})
@EnableJpaRepositories(
        basePackages = "com.student.application.repository.app2",
        entityManagerFactoryRef = "app2EntityManager",
        transactionManagerRef = "app2TransactionManager")
public class App2DBConfiguration {
    @Autowired
    private Environment env;

    @Bean
    @ConfigurationProperties(prefix = "spring.app2")
    public DataSource app2DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean app2EntityManager() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(app2DataSource());
        em.setPackagesToScan(
                "com.student.application.domain.app2");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto",
                "none");
        properties.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        properties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Bean
    public PlatformTransactionManager app2TransactionManager() {
        JpaTransactionManager transactionManager
                = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                app2EntityManager().getObject());
        return transactionManager;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-11-16 10:41:08

一架飞机可以只有一架飞机,但一架飞机可以有不止一架飞机.因此,在飞机上,这里不需要@OneToMany(mappedBy = "Flight")联接列。

我假设你希望它被航班映射,并将所有信息存储在飞行表中。您可以将所有这些表连接起来,并创建flight_aircraft表。

航班-> @ManyToOne @JoinColumn(name="aircraft_id")注记

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74458648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档