java - PSQL异常 : ERROR: duplicate key value violates unique constraint when using Hibernate

标签 java spring hibernate

我有两个对象,它们之间具有一对多关系,我实现如下:

@Entity
@Table(name = "details")
public class MainDetails {
     @Id
     @Column(name = "details_id")
     @GeneratedValue(strategy= GenerationType.AUTO)
     private Long id;

     // Some other fields here - omitted

     @OneToMany(fetch = FetchType.LAZY,
                mappedBy = "details",
                targetEntity = State.class,
                cascade = CascadeType.ALL)
     @OrderBy("timestamp DESC")
     private List<State> states;
}

第二个:

@Entity
@Table(name = "state")
public class State {

     @Id
     @Column(name = "state_id")
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;

     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "details_id")
     private MainDetails details;

     // Other fields omitted (including timestamp)

}

我在 MainDetails 对象上调用了一个 save() 方法。该方法如下所示:

public T save(T obj) { // The T in this case is MainDetails
  entityManager.persist(obj);
  entityManager.flush();
  return obj;
}

但是我得到了这个异常:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "details_pkey" Detail: Key (details_id)=(8) already exists.

我的 persistence.xml 看起来像这样:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">
  <persistence-unit name="my-persistence-unit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <!-- Annotated entity classes -->
    <class>com.company.entity.MainDetails</class>
    <class>com.company.entity.State</class>

    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL82Dialect" />
      <property name="hibernate.hbm2ddl.auto" value="create-drop" />
      <property name="hibernate.enable_lazy_load_no_trans" value="true"/>
    </properties>
  </persistence-unit>
</persistence>

我的 spring 上下文是这样的:

@EnableJpaRepositories(basePackages = {"com.company.dao", "com.company.*.dao"})
@EnableTransactionManagement(proxyTargetClass = true)
@Import(BasicConfig.class)
public class DbConfig {

  @Value("${db.connection_string}")
  private String connectionString;

  @Value("${db.user_name}")
  private String dbUserName;

  @Value("${db.password}")
  private String dbPassword;

  @Bean
  public DataSource dataSource() {
    DriverManagerDataSource driver = new DriverManagerDataSource();
    driver.setDriverClassName("org.postgresql.Driver");
    driver.setUrl(connectionString);
    driver.setUsername(dbUserName);
    driver.setPassword(dbPassword);
    return driver;
  }

  @Bean
  public JpaVendorAdapter jpaVendorAdapter() {
    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setShowSql(true);
    adapter.setGenerateDdl(true);
    adapter.setDatabase(Database.POSTGRESQL);
    return adapter;
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException {
    LocalContainerEntityManagerFactoryBean factoryBean = new  LocalContainerEntityManagerFactoryBean();
    factoryBean.setDataSource(dataSource());
    factoryBean.setPersistenceUnitName("my-persistence-unit");
    factoryBean.setJpaVendorAdapter(jpaVendorAdapter());

    return factoryBean;
  }

  @Bean
  public JpaTransactionManager transactionManager() throws ClassNotFoundException {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

    return transactionManager;
  }
}

最佳答案

好吧,那是我的错误(当然),我改变了 3 件事以使其工作:

  1. 将两个类更改为:@GeneratedValue(strategy= GenerationType.TABLE)(最初我使用的是 GenerationType.AUTO)。

    <
  2. 我发现调用 save() 的方法也调用了 entityManager.flush()。删除冗余线后,它解决了问题。打败我的原因 - 我希望 hibernate 在冗余 flush() 调用上什么也不做,但显然这是解决问题的必要条件。

关于java - PSQL异常 : ERROR: duplicate key value violates unique constraint when using Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36397008/

相关文章:

mysql - Hibernate 创建模式中的 UTF-8 问题

java - 想要检索给定 WebElement 的 Xpath

java - 阅读从右到左的pdf文本时如何保持单词顺序

java - 8 拼图java : binary operator

java - JUnit |模拟服务器|休息模板

java - Spring Ehcache3 导致键类型和值类型异常

java - 读取 prop 文件 bean 错误

java - 添加一些jar后无法启动Tomcat-8.5.20

java - 阻止 Hibernate 在关联集合中保留更改

java - 不审计 OneToMany 关系有什么缺点?