同时在字段上使用@Column,在getter和setter方法上使用@Transient

4
请解释 @Transient 同时放置在 getter 和 setter 方法上的目的,同时 @Column 放置在字段上。该字段将按照我们的需要存储到数据库中。
@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;
    }
}
3个回答

1
在您的代码中,它们没有效果,因为字段上的@Id会导致默认访问为字段,从而忽略任何方法注释。如果属性访问是默认值(通过getter上的@Id或类上的@Access(PROPERTY)),则@Transient注释会导致JPA忽略访问器,这样可以选择字段映射。但是,在这种情况下,该字段应标注@Access(FIELD)。
我认为@Transient注释是遗留物,当实体具有默认属性访问权限时留下的。

0

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


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接