1

让我们考虑这个图表

一个流派表和轨道表,其中轨道在流派上有一个 FK,流派只包含 PK“名称”

使用 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 说明该密钥在 Genre 中不存在。

有什么办法可以避免必须创建 Genre 类,首先坚持 Genre,最后坚持 Track?

4

1 回答 1

1

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

于 2013-11-05T12:50:52.573 回答