2016-08-11 5 views
2

@Transientがゲッターとセッターのメソッドに@Columnがフィールドに配置されたときにどのような目的で配置されたのか説明してください。 フィールドは必要に応じてDBに格納されます。フィールドに@Columnを、ゲッターとセッターに@Transientを一度に配置

@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; 
    } 
} 

答えて

0

これは実際には難しい状況です。 @transient注釈とtransientキーワードは同じ機能を提供しません。 transientキーワードを使用してもデータはシリアル化されません。 @transient注釈を使用するとデータはシリアライズされますが、@columnアノテーションのフィールドにはpersistedというフィールドが設定されているため、データベースにはpersistedは含まれません。@Columnはデータベースの列の名前を指定できるため属性は永続化されます。

0

フィールドの@Idはデフォルトのアクセスをフィールドにするため、メソッドの注釈は無視されるため、コードには何の効果もありません。プロパティへのアクセスがデフォルト(ゲッターの@Idまたはクラスの@Access(PROPERTY)のいずれか)の場合、@TransientアノテーションはJPAにアクセサを無視させ、おそらくフィールドマッピングを取得できるようにします。ただし、この場合、フィールドには@Access(FIELD)というアノテートを付ける必要があります。

@Transientアノテーションは、エンティティがデフォルトのプロパティアクセス権を持っていた時点からの残り物です。

0

私はそれが無視されていると思われます。列は既にマークされており、必要に応じて更新されていると言えます。ロギングを有効にすると、警告が生成されるのでこれを確認します

新しいテストフィールドを作成し、getter/setterをTransientとしてマークするテストを行うことができます

関連する問題