将@Column放在字段上,将@Transient放在getter和setter上

时间:2016-08-11 16:34:27

标签: java spring hibernate spring-orm

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

@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 个答案:

答案 0 :(得分:0)

这实际上是一个棘手的情况。 onStudentIdChanged注释和public static void main(String[] args) { String[] bagOfWords = {"i", "like", "to", "play", "tennis", "think", "football", "needs", "big", "changes"}; List<String> sentences = new ArrayList<String>(); sentences.add("i like to play tennis"); sentences.add("i think football needs big changes"); sentences.add("i like football"); for(String s1 : sentences){ String[] sentenceSplit = splitWords(s1); for(int i=0;i<sentenceSplit.length;i++){ if(sentenceSplit[i].equals(bagOfWords[i])){ System.out.print("1 "); } else{ System.out.print("0 "); } } System.out.println(""); } } private static String[] splitWords(String sentence){ String[] afterSplit = sentence.split(" "); return afterSplit; } 关键字不提供相同的功能。使用@transient关键字不会序列化您的数据。但是使用transient注释将序列化数据但不会在数据库中transient,因为您已在数据库中标记了@transient注释字段为persisted的字段因为@column允许您指定数据库中要保留该属性的列的名称。

答案 1 :(得分:0)

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

我认为@Transient注释是实体具有默认属性访问权时的剩余部分。

答案 2 :(得分:0)

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

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