虽然我在我的类中标记了一些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读取数据库中所有歌曲的列表时,我看到尽管有符号,该字段仍然存在。
有人可以告诉我为什么会这样吗?
答案 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会坚持这个。