【问题标题】:Placing @Column on field and @Transient on getter and setter at once一次将@Column 放在字段上,将@Transient 放在getter 和setter 上
【发布时间】:2016-12-18 12:21:55
【问题描述】:

请解释在将@Column 放置在字段上的同时将@Transient 放置在getter 和setter 方法上的目的。 该字段根据需要存储到数据库中。

@Entity

@Table(name = "person")

public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Column(name = "name")
    private String name; 

    @Transient
    public long getName() {
        return name;
    }

    @Transient
    public void setName(String name) {
        this.name = name;
    }
}

【问题讨论】:

    标签: java spring hibernate spring-orm


    【解决方案1】:

    这实际上是一个棘手的情况。 @transient 注释和 transient 关键字不提供相同的功能。使用 transient 关键字不会序列化您的数据。但是使用@transient 注释将序列化数据,但不会在数据库中为persisted,因为您已使用@column 注释标记该字段,该字段将在数据库中为persisted,因为@Column 允许您指定数据库中要保存属性的列的名称。

    【讨论】:

      【解决方案2】:

      在您拥有的代码中,它们不起作用,因为字段上的@Id 导致默认访问为字段,因此忽略任何方法注释。如果属性访问是默认的(通过getter 上的@Id 或类上的@Access(PROPERTY)),@Transient 注释将导致JPA 忽略访问器,大概是为了获取字段映射。但是,在这种情况下,该字段应使用@Access(FIELD) 进行注释。

      我会说@Transient 注释是实体具有默认属性访问时的遗留物。

      【讨论】:

        【解决方案3】:

        我怀疑它被忽略了,因为该列已被标记,并且正如您所说,它正在根据需要进行更新。启用日志记录将确认这一点,因为它会生成警告

        您可以进行测试,创建一个新的测试字段并将 getter/setter 标记为瞬态

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-21
          • 2014-04-07
          • 1970-01-01
          • 2011-11-28
          • 2016-06-21
          • 2013-02-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多