Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 未找到spring启动外键_Postgresql_Spring Boot_Liquibase - Fatal编程技术网

Postgresql 未找到spring启动外键

Postgresql 未找到spring启动外键,postgresql,spring-boot,liquibase,Postgresql,Spring Boot,Liquibase,我有一个sprint boot 1.1.4.RELEASE应用程序,使用liquibase和postgresql 我有两个实体: @Entity public class Menu { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long menuId; @OneToMany(cascade = CascadeType.ALL, mappedBy = "menu", fetch = F

我有一个sprint boot 1.1.4.RELEASE应用程序,使用liquibase和postgresql

我有两个实体:

@Entity
public class Menu {

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

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "menu", fetch = FetchType.EAGER)
    private List<MenuItem> menuItems = new ArrayList<MenuItem>();

    @ManyToOne
    @JoinColumn(name = "subscriptionPackageId", nullable = false)
    private SubscriptionPackage subscriptionPackage;

    private String displayText;
    private int displayOrder;
我的db.changelog-master.xml中有以下内容:

    <databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd"
        objectQuotingStrategy="QUOTE_ALL_OBJECTS">

    <changeSet id="1" author="me" >
        <preConditions onFail="MARK_RAN">
            <not>
                <tableExists tableName="SubscriptionPackage"/>
                <tableExists tableName="Menu"/>
                <tableExists tableName="MenuItem"/>
            </not>
        </preConditions>

        <createSequence sequenceName="hibernate_sequence"/>

        <createTable tableName="SubscriptionPackage">
            <column name="subscriptionPackageId" type="bigint" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="servicePackage" type="varchar(300)"/>
            <column name="description" type="varchar(500)"/>
        </createTable>


        <createTable tableName="Menu">
            <column name="menuId" type="bigint" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="subscriptionPackageId" type="bigint"/>
            <column name="displayText" type="varchar(300)"/>
            <column name="displayOrder" type="int"/>
        </createTable>

        <createTable tableName="MenuItem">
            <column name="menuItemId" type="bigint" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="menuId" type="bigint">
                <!--<constraints foreignKeyName="fk_menu_item" references="Menu(menuId)"/>-->
            </column>
            <column name="displayText" type="varchar(100)"/>
            <column name="path" type="varchar(100)"/>
            <column name="toolTip" type="varchar(500)"/>
            <column name="displayOrder" type="int"/>
            <column name="callType" type="varchar(50)"/>
        </createTable>
    </changeSet>
</databaseChangeLog>
我有一个假设:

@Repository
public interface MenuRepository extends CrudRepository<Menu, Long> {
    List<Menu> findAll();
    List<Menu> findBySubscriptionPackage( SubscriptionPackage subscriptionPackage);
}
正在提交的sql是:

select menu0_.menu_id as menu_id1_0_, menu0_.display_order as display_2_0_, menu0_.display_text as display_3_0_, menu0_.subscription_package_id as subscrip4_0_ from menu menu0_
我认为我的映射很好,菜单包含许多双向关系的菜单项。我有一些其他映射由于相同类型的问题而失败,这些映射在关系错误名称中有下划线而不是驼峰大小写;这让我怀疑这是否是我使用spring.jpa.hibernate.ejb.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy的副作用

基于“a_horse_with_no_name”的优秀建议,我通过SQL手动创建了没有引号的菜单表,我得到了另一个错误:

Caused by: org.postgresql.util.PSQLException: ERROR: column menu0_.menu_id does not exist
这也是一个案例问题,所以我必须错误地配置Liquibase,让Postgresql忽略案例和camelcase

我已在我的更改日志中尝试了以下操作:

objectQuotingStrategy="LEGACY"
objectQuotingStrategy="QUOTE_ALL_OBJECTS"
objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"

这三个都用引号创建了我的表和列。

好的,我已经解决了所有的问题,我正在发帖,以防其他人也有同样的问题。似乎Spring Boot或其他什么东西希望列名使用下划线而不是大小写。我将我的liquibase变更集更改为:

 <createTable tableName="MENU">
            <column name="menu_id" type="bigint" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="subscription_package_id" type="bigint"/>
            <column name="display_text" type="varchar(300)"/>
            <column name="display_order" type="int"/>
        </createTable>
实体案例之间有一个“u”。我不知道是否有一种方法可以覆盖它,或者我是否应该,就像我对EJBNamingStrategy所做的那样。我在任何地方都找不到它的文档,但我碰巧在SpringBootFlyway项目的集成测试中注意到了它


这感觉不对,我不记得以前必须在实体上声明表名,但我是Postgresql新手,所以我不能说是因为它区分大小写还是问题出在哪里。如果这是正确的,如果我在某个地方犯了错误,我很想再听听。

您使用带引号的标识符创建了表,这意味着它们现在区分大小写<代码>“菜单”是与
菜单
不同的表名。我建议重新创建所有不带引号的表。从长远来看,这将给您带来更少的麻烦。我不知道我在哪里创建了带引号的表。我用XML为liquibase定义了它们。你的意思是这是一个区分大小写的问题,我应该使用@Table(name=“menu”)或其他任何东西,这样大小写才是正确的?我不确定我是否理解你的意思。
创建表“MenuItem”
-可能是你在Liquibase中定义它们的方式。如果没有这些,我不知道如何告诉Liquibase创建db表。如果我理解你,我的表和实体被命名为“菜单”,而关系是“菜单”?我还有一个错误,表是SubscriptionPackage,缺少的关系是“subscription\u package”,这也是一个区分大小写的问题吗?好的,所以我通过SQL手动创建了菜单表,没有引号,这让我克服了这个错误,关于其他错误:ERROR:column menu0.menu id不存在,因此这看起来像是引用/case/camelCase问题。当我使用Liquibase创建和管理数据库时,我做错了什么?我将更新我的问题以显示整个更改文件。
select menu0_.menu_id as menu_id1_0_, menu0_.display_order as display_2_0_, menu0_.display_text as display_3_0_, menu0_.subscription_package_id as subscrip4_0_ from menu menu0_
Caused by: org.postgresql.util.PSQLException: ERROR: column menu0_.menu_id does not exist
objectQuotingStrategy="LEGACY"
objectQuotingStrategy="QUOTE_ALL_OBJECTS"
objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS"
 <createTable tableName="MENU">
            <column name="menu_id" type="bigint" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="subscription_package_id" type="bigint"/>
            <column name="display_text" type="varchar(300)"/>
            <column name="display_order" type="int"/>
        </createTable>
@Entity
@Table(name = "MENU")
public class Menu {
...
}