【问题标题】:Error trying to save to Postgresql with Spring & Hibernate尝试使用 Spring & Hibernate 保存到 Postgresql 时出错
【发布时间】:2015-04-13 09:56:32
【问题描述】:

我有一个使用 spring-data-jpa、liquibase 和 postgresql 的 spring-boot 1.2.1 应用程序。我有两个要坚持的实体,但我遇到了一个似乎没有意义的错误(至少对我而言)。

这是我的 liquibase 定义:

<createTable tableName="ROLE">
     <column name="role_id" type="bigint" autoIncrement="true">
           <constraints primaryKey="true"/>
     </column>
      <column name="role_type" type="varchar(100)"/>
      <column name="role_description" type="varchar(300)"/>
  </createTable>

  <createTable tableName="ROLEMENU">
      <column name="role_menu_id" type="bigint" autoIncrement="true">
           <constraints primaryKey="true"/>
       </column>
       <column name="role_id" type="bigint"/>
       <column name="display_text" type="varchar(500)"/>
       <column name="display_order" type="int"/>
   </createTable>

和实体:

@Entity
@Table(name = "ROLE")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long roleId;

    @Enumerated(EnumType.STRING)
    @Column(name = "roleType", nullable = false)
    private RoleType roleType;

    private String roleDescription;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "role", fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<RoleMenu> roleMenuList = new ArrayList<RoleMenu>();
//getters and setters
}

@Entity
@Table(name = "ROLEMENU")
public class RoleMenu {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long roleMenuId;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "roleMenu", fetch = FetchType.EAGER)
    private List<RoleMenuItem> roleMenuItems = new ArrayList<RoleMenuItem>();

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "roleId")
    private Role role;

    private String displayText;
    private int displayOrder;
    //getters and setters
    }

我使用播种机来填充数据库:

@Component
public class RoleSeeder {
@Autowired
private RoleRepository roleRepository;

public List<Role> seed() {
    List<Role> roles = new ArrayList<Role>();
    roles.add( RoleFactory.buildRole( RoleType.OWNER ) );
    roles.add( RoleFactory.buildRole( RoleType.VISITOR ) );
    roleRepository.save( roles );
    return roles;
}

使用它来创建:

private static Role buildOwner() {
        Role owner = new Role();
        owner.setRoleDescription( OWNER_DESCRIPTION );
        owner.setRoleType( RoleType.OWNER );
        return owner;
    }

当 CRUDRepository 尝试保存时,我得到以下异常:

2015-02-12 08:09:32.422 DEBUG 10089 --- [           main] org.hibernate.SQL                        : insert into role (role_description, role_type) values (?, ?)
Hibernate: insert into role (role_description, role_type) values (?, ?)
2015-02-12 08:09:32.435 DEBUG 10089 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : could not execute statement [n/a]

org.postgresql.util.PSQLException: ERROR: relation "role" does not exist
  Position: 13

这在 H2 上运行得非常愉快,但我不确定 PostgreSQL 期望我解释哪些差异。

需要注意的一点是,如果我设置了 spring.datasource 属性,则不会调用 Liquibase。如果我将它们注释掉,似乎会创建默认数据源,然后执行 java 代码。这是我用于我的 Postgresql 的值:

spring.datasource.url=jdbc:postgresql://localhost:5432/myschema
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driverClassName=org.postgresql.Driver
spring.jpa.database=POSTGRESQL

【问题讨论】:

  • 也许你的混淆层(又名 ORM)使用quoted identifiers 创建了大写的表?您是否检查了数据库中的表是如何创建的?
  • 你检查过表是否存在吗?您在执行测试之前是否执行了 liquibase 迁移?
  • 播种器发生在应用程序启动时,因此应该由 liquibase 创建它们。但是,当我查看 pgAdmin 时,这些表不存在。我认为这是因为启动失败并且表未提交。但我对 Liquibase 还很陌生,所以我不确定我是否正确。
  • 我没用过播种机,但是PostgreSQL支持autoIncrement吗?如果失败,它不应该记录错误消息吗?
  • 您为播种机提供的代码根本不使用 Liquibase。那么,什么时候执行 liquibase 迁移?

标签: hibernate postgresql spring-data-jpa liquibase


【解决方案1】:

多亏了良好的反馈,我才意识到我忘记将 spring.jpa.hibernate.ddl-auto=create-drop 添加到我的 application.properties。重新阅读 Spring-boot 文档后,我发现如果您使用的是内存数据库,Spring-boot 将自动创建您的模式。否则,您需要告诉它创建表。

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 2016-03-05
    • 2012-10-04
    • 2021-01-10
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多