Java JPA EntityManager未合并目标数据库中的实体

Java JPA EntityManager未合并目标数据库中的实体,java,jpa,entitymanager,Java,Jpa,Entitymanager,我正在执行从源数据库读取一行的任务,如果目标数据库中存在相同的记录,则将该行合并到目标数据库中。我已经检查了两个entityManager对象的数据源,它们看起来很好 我正在为各自的源数据库和目标数据库创建一个名为primary和secondary的bean: @Bean(name = "primary") @Primary public LocalContainerEntityManagerFactoryBean entityManager() { LocalContainerEnt

我正在执行从源数据库读取一行的任务,如果目标数据库中存在相同的记录,则将该行合并到目标数据库中。我已经检查了两个entityManager对象的数据源,它们看起来很好

我正在为各自的源数据库和目标数据库创建一个名为primary和secondary的bean:

@Bean(name = "primary")
@Primary
public LocalContainerEntityManagerFactoryBean entityManager() {

    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setPersistenceUnitName("primary");
    em.setPersistenceXmlLocation("classpath:./META-INF/persistence.xml");
    // PropertyPlaceholderConfigurer
    // configurer=appConfig.getPropertyPlaceholderConfigurer();

    em.setDataSource(dataSource());

    HashMap<String, Object> properties = new HashMap<String, Object>();
    properties.put("hibernate.hbm2ddl.auto", hibernateHbm2ddlAuto);
    properties.put("hibernate.dialect", hibernateDialect);
    properties.put("hibernate.show_sql", true);
    em.setJpaPropertyMap(properties);

    em.setPackagesToScan(new String[] { "org.x.y" });

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);

    return em;
}
@Bean(name=“primary”)
@初级的
public LocalContainerEntityManagerFactoryBean entityManager(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setPersistenceUnitName(“主”);
em.setPersistenceXmlLocation(“类路径:./META-INF/persistence.xml”);
//PropertyPlaceholderConfigurer
//configurer=appConfig.GetPropertyPlaceHolderConfigure();
em.setDataSource(dataSource());
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”,hibernateHbm2ddlAuto);
properties.put(“hibernate.dial”,hibernateDialect);
properties.put(“hibernate.show_sql”,true);
em.setJpaPropertyMap(属性);
em.setPackagesToScan(新字符串[]{“org.x.y”});
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
返回em;
}

@Bean(name=“secondary”)
public LocalContainerEntityManagerFactoryBean targetEntityManager(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setPersistenceUnitName(“次要”);
em.setPersistenceXmlLocation(“类路径:./META-INF/persistence.xml”);
em.setDataSource(targetDataSource());
//PropertyPlaceholderConfigurer
//configurer=appConfig.GetPropertyPlaceHolderConfigure();
em.setPackagesToScan(新字符串[]{“org.x.y”});
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”,hibernateHbm2ddlAuto);
properties.put(“hibernate.dial”,hibernateDialect);
properties.put(“hibernate.show_sql”,true);
em.setJpaPropertyMap(属性);
返回em;
}
由于JPA需要在persistence.xml中定义一个数据源,因此我指定了相同的数据源。但仍无法合并目标数据库中的记录。
如果我遗漏了一些内容,请提出建议

您不能简单地从一个实体复制到另一个实体。您必须创建一个新实例,复制所有值(如果有嵌套对象,也要复制这些值)。您不能简单地从源中读取entity1并将entity1保存在目标中。JPA不是这样工作的。另外,在用Spring配置persistence.xml时,您可以删除它。同样,如果没有事务,则不会保留任何内容。…。@M.Deinum:谢谢,我已经准备好了事务,但是如果我正在创建一个新实例并复制值以及主标识符,那么仍然会面临相同的问题。您的意思是“新实例”不应该复制主键值吗?如果您可以复制标识符,则取决于您如何指定它们。Hibernate还将使用这些来确定它是否是新的。是的,当我调用persist()传递不在主数据库中的实体时,它抛出“PersistentObjectException:分离的实体传递给persist”,当我在内部调用merge时,它调用“select SEQ.nextval from dual”并获取目标数据库中主键的下一个值,合并后目标数据库中不会反映任何内容
@Bean(name = "secondary")
public LocalContainerEntityManagerFactoryBean targetEntityManager() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setPersistenceUnitName("secondary");
    em.setPersistenceXmlLocation("classpath:./META-INF/persistence.xml");
    em.setDataSource(targetDataSource());
    // PropertyPlaceholderConfigurer
    // configurer=appConfig.getPropertyPlaceholderConfigurer();

    em.setPackagesToScan(new String[] { "org.x.y" });

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    HashMap<String, Object> properties = new HashMap<String, Object>();
    properties.put("hibernate.hbm2ddl.auto", hibernateHbm2ddlAuto);
    properties.put("hibernate.dialect", hibernateDialect);
    properties.put("hibernate.show_sql", true);
    em.setJpaPropertyMap(properties);

    return em;
}