Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
Java 与外键约束斗争_Java_Sql_Jpa_Liquibase - Fatal编程技术网

Java 与外键约束斗争

Java 与外键约束斗争,java,sql,jpa,liquibase,Java,Sql,Jpa,Liquibase,我确实在定义一些外键时遇到问题。 我有一个发行人,他有一个地址。 我有一个地址谁有一个国家 我试图在这些POJO上使用Liquibase定义外键约束,但运气不好,仍然出现相同的错误: Caused by: liquibase.exception.DatabaseException: Column "COUNTRY_ID" not found; SQL statement: ALTER TABLE PUBLIC.ADDRESS ADD CONSTRAINT FK_ADDRESS

我确实在定义一些外键时遇到问题。 我有一个发行人,他有一个地址。 我有一个地址谁有一个国家

我试图在这些POJO上使用Liquibase定义外键约束,但运气不好,仍然出现相同的错误:

Caused by: liquibase.exception.DatabaseException: Column "COUNTRY_ID" not found; SQL statement:
ALTER TABLE PUBLIC.ADDRESS ADD CONSTRAINT FK_ADDRESS_TO_COUNTRY FOREIGN KEY (COUNTRY_ID) REFERENCES PUBLIC.COUNTRY (ID) [42122-200] [Failed SQL: (42122) ALTER TABLE PUBLIC.ADDRESS ADD CONSTRAINT FK_ADDRESS_TO_COUNTRY FOREIGN KEY (COUNTRY_ID) REFERENCES PUBLIC.COUNTRY (ID)]
这是我的课

@Entity
@Table(name = "COUNTRY")
@SequenceGenerator(name = "seq_country", sequenceName = "SEQ_COUNTRY", allocationSize = 1)
public class Country {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_country")
    private Long id;

    @Column(name = "SHORT_NAME")
    private String shortName;

    @Column(name = "NAME")
    private String name;

    @OneToMany(mappedBy = "country", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Address> addresses;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getShortName() {
        return shortName;
    }

    public void setShortName(String shortName) {
        this.shortName = shortName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Address> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }

@实体
@表(name=“发卡机构”)
@SequenceGenerator(name=“seq_issuer”,sequenceName=“seq_issuer”,allocationSize=1)
公共类发行人{
@身份证
@列(name=“ID”)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“seq_发行人”)
私人长id;
@列(name=“name”)
私有字符串名称;
@OneToOne(级联=级联类型.ALL)
@JoinColumn(name=“ADDRESS\u ID”)
私人地址;
@列(name=“邮件地址”)
私有字符串电子邮件地址;
@列(name=“公司\联系方式\参考”)
私人字符串联系人;
@列(name=“其他联系人”
私人联络人;
@OneToMany(mappedBy=“issuer”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
私人收藏资产;
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getEmailAddress(){
返回电子邮件地址;
}
public void setEmailAddress(字符串emailAddress){
this.emailAddress=电子邮件地址;
}
公共字符串getContactPerson(){
返回联系人;
}
public void setContactPerson(字符串contactPerson){
this.contactPerson=联系人;
}
公共字符串getOtherContactPerson(){
返回其他联系人;
}
public void setOtherContactPerson(字符串otherContactPerson){
this.otherContactPerson=otherContactPerson;
}
公共集合getAssets(){
归还资产;
}
公共资产(集合资产){
这是资产=资产;
}
公共广播getAddress(){
回信地址;
}
公共无效设置地址(地址){
this.address=地址;
}
}


如果有人有同样的问题,或者在这里看到一些可怕的事情,不要犹豫


谢谢,Stephanie

首先,地址表中没有列名COUNTRY\u ID,但您仍在尝试使用此列创建外键

    <addForeignKeyConstraint baseTableName="ADDRESS" baseColumnNames="COUNTRY_ID"
                             constraintName="FK_ADDRESS_TO_COUNTRY" 
    referencedTableName="COUNTRY"
                             referencedColumnNames="ID"/>


将基本列名从COUNTRY_ID更改为ID

hi&welcome!:)第一个“微小”问题(但它可能会解决!):对于前3个变更集,您显然混淆了
作者
id
。例外情况是:您的表“ADDRESS”没有列“COUNTRY_id”,因此无法在该列上创建外键约束。Thx,@ThomasKläger。。所以
内部的
可以解决这个问题。@xerx593非常感谢!!很明显,我晚上要睡觉了,谢谢!所有这些我都看过至少10遍了。
@Entity
@Table(name = "ISSUER")
@SequenceGenerator(name = "seq_issuer", sequenceName = "SEQ_ISSUER", allocationSize = 1)
public class Issuer {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_issuer")
    private Long id;

    @Column(name = "NAME")
    private String name;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "ADDRESS_ID")
    private Address address;

    @Column(name = "MAIL_ADDRESS")
    private String emailAddress;

    @Column(name = "COMPANY_CONTACT_REF")
    private String contactPerson;

    @Column(name = "OTHER_CONTACT_REF")
    private String otherContactPerson;

    @OneToMany(mappedBy = "issuer", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Collection<Asset> assets;

    public Long getId() {

        return id;
    }

    public void setId(Long id) {

        this.id = id;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {

        this.name = name;
    }

    public String getEmailAddress() {

        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {

        this.emailAddress = emailAddress;
    }

    public String getContactPerson() {

        return contactPerson;
    }

    public void setContactPerson(String contactPerson) {

        this.contactPerson = contactPerson;
    }

    public String getOtherContactPerson() {

        return otherContactPerson;
    }

    public void setOtherContactPerson(String otherContactPerson) {

        this.otherContactPerson = otherContactPerson;
    }

    public Collection<Asset> getAssets() {

        return assets;
    }

    public void setAssets(Collection<Asset> assets) {

        this.assets = assets;
    }

    public Address getAddress() {

        return address;
    }

    public void setAddress(Address address) {

        this.address = address;
    }
}
<changeSet id="sremy" author="DEV-194-01">
    <dropColumn tableName="ASSET" columnName="LEGAL_ADDRESS"/>
    <dropColumn tableName="ASSET" columnName="MAIL_ADDRESS"/>
    <dropColumn tableName="ASSET" columnName="COMPANY_CONTACT_REF"/>
    <dropColumn tableName="ASSET" columnName="OTHER_CONTACT_REF"/>
    <dropColumn tableName="ASSET" columnName="COMPANY"/>
    <dropColumn tableName="ASSET" columnName="COUNTRY"/>
</changeSet>
<changeSet id="sremy" author="DEV-194-02">

    <createTable tableName="COUNTRY">
        <column name="ID" type="BIGINT">
            <constraints nullable="false"/>
        </column>
        <column name="CODE_ALPHA_2" type="VARCHAR(2)"/>
        <column name="NAME" type="VARCHAR(50)"/>
    </createTable>

    <addPrimaryKey tableName="COUNTRY" columnNames="ID"
                   constraintName="PK_COUNTRY"/>
    <createSequence sequenceName="SEQ_COUNTRY"/>

</changeSet>

<changeSet id="sremy" author="DEV-194-03">
    <createTable tableName="ADDRESS">
        <column name="ID" type="BIGINT">
            <constraints nullable="false"/>
        </column>
        <column name="ADDRESS" type="VARCHAR(250)"/>
        <column name="POSTAL_CODE" type="VARCHAR(20)"/>
        <column name="CITY" type="VARCHAR(250)"/>
    </createTable>

    <addPrimaryKey tableName="ADDRESS" columnNames="ID"
                   constraintName="PK_ADDRESS"/>
    <createSequence sequenceName="SEQ_ADDRESS"/>


    <addForeignKeyConstraint baseTableName="ADDRESS" baseColumnNames="COUNTRY_ID"
                             constraintName="FK_ADDRESS_TO_COUNTRY" referencedTableName="COUNTRY"
                             referencedColumnNames="ID"/>
</changeSet>

<changeSet author="sremy" id="DEV-194-04">

    <createTable tableName="ISSUER">

        <column name="ID" type="BIGINT">
            <constraints nullable="false"/>
        </column>
        <column name="NAME" type="VARCHAR(250)">
        </column>
        <column name="MAIL_ADDRESS" type="VARCHAR(250)">
        </column>
        <column name="COMPANY_CONTACT_REF" type="VARCHAR(250)">
        </column>
        <column name="OTHER_CONTACT_REF" type="VARCHAR(250)">
        </column>
    </createTable>

    <addPrimaryKey tableName="ISSUER" columnNames="ID"
                   constraintName="PK_ISSUER"/>
    <createSequence sequenceName="SEQ_ISSUER"/>

    <addForeignKeyConstraint baseTableName="ISSUER" baseColumnNames="ADDRESS_ID"
                             constraintName="FK_ISSUER_TO_ADDRESS" referencedTableName="ADDRESS"
                             referencedColumnNames="ID"/>

</changeSet>

<changeSet id="sremy" author="DEV-194-05">
    <addColumn tableName="ASSET">
        <column name="ISSUER_ID" type="BIGINT">
            <constraints nullable="false"/>
        </column>
    </addColumn>
    <addForeignKeyConstraint
            baseTableName="ASSET" baseColumnNames="ISSUER_ID"
            referencedTableName="ISSUER" referencedColumnNames="ID"
            constraintName="FK_ASSET_TO_ISSUER"/>
</changeSet>
    <addForeignKeyConstraint baseTableName="ADDRESS" baseColumnNames="COUNTRY_ID"
                             constraintName="FK_ADDRESS_TO_COUNTRY" 
    referencedTableName="COUNTRY"
                             referencedColumnNames="ID"/>