为什么 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());
}
我正在尝试创建一个 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());
}