【发布时间】: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