JPA 嵌套映射到没有基表的视图

Kes*_*uwa 3 java jpa hibernate-mapping spring-data spring-data-jpa

所以我有一个叫做 OmsJob 的视图。我将它映射到一个 POJO 并且它有draftFiletrackedFilecleanFile,和其他文件与链接的文件表。和往常一样,我映射了这样的:

@Entity
@EntityListeners(PreventAnyUpdate.class)
@ConfigurationProperties("omsjob")
@Table(name = "OMSJob")
public class OmsJob {
    @NotNull
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "draft_file_id")
    private SomeFile draftFile;
}
Run Code Online (Sandbox Code Playgroud)

工作正常,基本上是:

{
  "omsjob": {
    "draftFile": {}
  }
}
Run Code Online (Sandbox Code Playgroud)

但我想要它像:

{
  "omsjob": {
    "fileDetails": {
      "draftFile": {}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个类并将其命名为 FileDetails 并制作它 @Embeddable@Embedded它变成OmsJob是这样的:

@Embeddable
public class FileDetails {
    @NotNull
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "draftFileId")
    private SomeFile draftFile;
}

@Entity
@EntityListeners(PreventAnyUpdate.class)
@ConfigurationProperties("omsjob")
@Table(name = "OMSJob")
public class OmsJob {
    @Embedded
    private FileDetails fileDetails;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误很明显,Caused by: java.sql.SQLException: 'MySchema.OMSJob' is not BASE TABLE. 它试图将外键添加到表中,我已将其映射到视图。但是我怎样才能实现我想要的目标,这是否是正确的方法?

更新 1

代码正在运行,它只是在启动应用程序时抛出错误。应该找到一种方法来处理该错误。

小智 7

只需要添加@javax.persistence.ForeignKey注解防止JPA添加外键即可:

@Embeddable
public class FileDetails {

    @NotNull
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "draftFileId", foreignKey = @ForeignKey(name = "none"))
    private SomeFile draftFile;

    /**
     * @return the draftFile
     */
    public SomeFile getDraftFile() {
        return draftFile;
    }
}
Run Code Online (Sandbox Code Playgroud)