Transient Getter 持久化 JPA Hibernate

Transient Getter is persisted JPA Hibernate

尽管我在 class 中将某些 getter 方法标记为 @Transient (javax.persistence),但调用该方法时的结果会保存在数据库中:

@Entity
@Table(name = "Song")
@EntityListeners(AuditingEntityListener.class)
public class Song implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "artist_id")
    private Artist artist;

      @Transient
    public static final Path MUSIC_DIRECTORY = Paths.get(System.getProperty("user.home"), "TUBEMIRROR-MUSIC");

    @Transient
    public String getPathBySongId(){
        return Paths.get(MUSIC_DIRECTORY.toString(), this.getYoutubeId() + ".mp3").toString();
    }
}

由于 songId 与文件系统上的歌曲路径存在 1:1 关系,因此我不想保留它。 当我使用 JPARepository 读取数据库中所有歌曲的列表时,我发现尽管有符号,该字段仍然存在。

谁能告诉我为什么会这样?

如果使用 (JPA) 注释,您应该注释任一字段或 getters,但不能同时注释两者。正在使用您的字段注释,因此如果忽略瞬态 getter (getPathBySongId) 的注释。注释 getters 仅当您希望得到尊重时。

static final 上的 JPA 注释毫无意义,因为无论如何都不会保留这些字段

在您的 class 上添加 @Access 注释,这样 jpa 将只考虑字段 注释

@Access(AccessType.FIELD)

在你的例子中:

@Entity
@Access(AccessType.FIELD)
@Table(name = "Song")
@EntityListeners(AuditingEntityListener.class)
public class Song implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "artist_id")
    private Artist artist;

    public static final Path MUSIC_DIRECTORY = Paths.get(System.getProperty("user.home"), "TUBEMIRROR-MUSIC");

    public String getPathBySongId(){
        return Paths.get(MUSIC_DIRECTORY.toString(), this.getYoutubeId() + ".mp3").toString();
    }
}

至少你可以在日志中看到为什么 jpa 会保留这个。