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 会保留这个。
尽管我在 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 会保留这个。