为什么 Spring Boot JPA & Postgresql 在与 Neo4J 一起使用时不保存实体?

Why doesn't Spring Boot JPA & Postgresql save entity when used with Neo4J?

我正在尝试创建一个 Spring 引导应用程序,它使用 JPA 和 Postgresql 在程序启动时持久保存一个实体(如果它尚不存在)。该应用程序还使用 Spring Data Neo4J。当我在 运行() 中对实体调用 save() 时,我可以看到没有创建任何实体。然而,当我使用来自 REST 控制器的相同代码时,实体就被创建了。如果我删除 Spring Data Neo4J 的所有部分,实体将在 运行() 中创建。请问有什么问题吗?

我的实体class:

@Entity
public class PersistentConfig {

    // ------------------------
    // PRIVATE FIELDS
    // ------------------------

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @NotNull
    private Boolean hasBeenInitialised;

    // ------------------------
    // PUBLIC METHODS
    // ------------------------

    protected PersistentConfig() {}

    public PersistentConfig(long id) {
        this.id = id;
        this.hasBeenInitialised= false;
    }

    public PersistentConfig(Boolean hasBeenInitialised) {
        this.hasBeenInitialised = hasBeenInitialised;
    }

    // Getters and setters methods
    // ...

    Boolean getHasBeenInitialised() {
        return hasBeenInitialised
    }

    void setHasBeenInitialised(Boolean hasBeenInitialised) {
        this.hasBeenInitialised = hasBeenInitialised
    }

    @Override
    public String toString() {
        return "id: ${id}, hasBeenInitialised: ${hasBeenInitialised}"
    }
}

存储库:

interface PersistentConfigRepository extends CrudRepository<PersistentConfig, Long> {

}

在主应用程序中 class:

@Override
public void run(String... strings) throws Exception {
    init()
}

public void init() {

    if (persistentConfigRepository.count() == 0) {
        try {
            PersistentConfig pc = new PersistentConfig(false);
            System.out.println("Created PersistentConfig: ${pc}");
            def rc = persistentConfigRepository.save(pc);
            System.out.println(rc)
        }
        catch (Exception ex) {
            System.out.println("Error creating the PersistentConfig: " + ex.toString());
        }
        System.out.println("PersistentConfig succesfully created, repo count = ${persistentConfigRepository.count()}");
    }
    else {
        System.out.println("PersistentConfig already exists");

    }

}

static void main(String[] args) {
    ApplicationContext ctx = SpringApplication.run(MyApplication.class, args);
}

这是我在程序启动时得到的输出:

Created PersistentConfig: id: 0, hasBeenInitialised: false
id: 24, hasBeenInitialised: false
PersistentConfig succesfully created, repo count = 0

如果在控制器中使用 init() 中的相同代码,则会创建并保留实体。 JPA 中的某些东西正在 init() 中创建实体,因为 id 正在递增(你可以看到我已经 运行 程序几次......),但它就是不会进入数据库(存储库上的计数为零,当我检查 table 时,那里什么也没有)。

编辑以显示相关日志,包括休眠日志语句:

Hibernate: select count(*) as col_0_0_ from persistent_config persistent0_
Created PersistentConfig: id: 0, hasBeenInitialised: false
Hibernate: select nextval ('hibernate_sequence')
id: 28, hasBeenInitialised: false
Hibernate: select count(*) as col_0_0_ from persistent_config persistent0_
PersistentConfig succesfully created, repo count = 0

编辑 2:当我删除所有 Spring Data Neo4J 代码时,我已经确定该代码有效。我需要用 DataSource bean 做些什么吗?

好的,将问题缩小到 JPA 和 Spring Data Neo4J 之间的某种形式的冲突后,我在这里找到了答案:How to get Spring Data Neo4j and Spring Data JPA to work together?

我将这两个 bean 添加到主应用程序中:

@Autowired
LocalContainerEntityManagerFactoryBean entityManagerFactory;

@Override
@Bean(name = "transactionManager")
public PlatformTransactionManager neo4jTransactionManager() throws Exception {
    return new ChainedTransactionManager(new JpaTransactionManager(entityManagerFactory.getObject()),
            new JtaTransactionManagerFactoryBean(graphDatabaseService()).getObject());
}