间接插入命名表?

时间:2013-11-05 12:34:03

标签: java database jpa

让我们考虑一下这个图

A Genre table and Track table, where track has a FK on Genre and Genre only consists of the PK 'name'

使用Track类的这个JPA片段。

@Entity
@Table(name = "track")
public class Track {
    @Id
    @Type(type="pg-uuid")
    private UUID id;

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

    /* Getters, setters, etc */
}

数据库架构

/** Liquibase */
<changeSet id="1" author="SoulBeaver">
    <createTable tableName="genre">
        <column name="name" type="VARCHAR(1024)">
            <constraints primaryKey="true" nullable="false" />
        </column>
    </createTable>

    <createTable tableName="track">
        <column name="id" type="UUID">
            <constraints primaryKey="true" nullable="false" />
        </column>
        <column name="genre" type="VARCHAR(1024)" />
    </createTable>
    <addForeignKeyConstraint baseTableName="track" baseColumnNames="genre" constraintName="genre_fk"
                             referencedTableName="genre"
                             referencedColumnNames="name" />
</changeSet>

现在,当我试图坚持一个已经获得track.setGenre(“Rock”)的曲目时;我收到一个RuntimeError,指出该类型中不存在该键。

有什么方法可以避免创建类型类,首先坚持类型,最后坚持轨道?

1 个答案:

答案 0 :(得分:1)

基本上,FKey约束的工作方式是,如果您尝试在父表中不存在FKey值的子表中插入值,则它将失败。这不是JPA特有的。这就是关系数据库的设计方式。