【问题标题】:Transient Getter is persisted JPA Hibernate瞬态 Getter 被持久化 JPA Hibernate
【发布时间】:2018-04-07 09:57:08
【问题描述】:

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

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

【问题讨论】:

  • 发布你的其他课程
  • 请检查您的持久实体类是否具有基于字段或属性的注释。
  • @DN1 我添加了类中的所有内容,除了吸气剂
  • @fisc 我对休眠还很陌生,但我认为我有基于字段的注释?
  • 默认不是FIELD。如果您在字段上放置映射注释,则访问类型为 FIELD,如果您在 getter 上放置映射注释,则访问类型为 PROPERTY。并且所有实体层次结构必须在映射注释放置中保持一致:总是在字段上,或者总是在 getter 上,但不能混合。

标签: hibernate jpa transient


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在你的类上添加 @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 会坚持这个。

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 2013-01-06
      • 1970-01-01
      • 2018-06-22
      • 2013-11-12
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多