瞬态Getter持久化JPA Hibernate

时间:2018-04-07 09:57:08

标签: hibernate jpa transient

虽然我在我的类中标记了一些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读取数据库中所有歌曲的列表时,我看到尽管有符号,该字段仍然存在。

有人可以告诉我为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

如果使用(JPA)注释,则应该注释EITHER字段或getter,但不能同时注释。正在使用您的字段注释,如果被忽略,则会使用瞬态 getter getPathBySongId)的注释。如果您希望得到尊重,请仅注释getter。

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

答案 1 :(得分:0)

在您的课程中添加@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会坚持这个。