回答:
Javaのtransient
キーワードは、フィールドがシリアル化されないことを示すために使用されますが、JPAの@Transient
注釈は、フィールドがデータベースに永続化されないこと、つまりセマンティクスが異なることを示すために使用されます。
意味が違うから。@Transient
注釈は、任意の(非永続化しないようにJPAプロバイダを伝えますtransient
)属性を。もう1つは、属性をシリアル化しないようにシリアル化フレームワークに指示します。@Transient
プロパティが必要な場合でも、それをシリアル化できます。
他の人が言ったように、@Transient
永続化すべきではないフィールドをマークするために使用されます。この短い例を考えてみましょう:
public enum Gender { MALE, FEMALE, UNKNOWN }
@Entity
public Person {
private Gender g;
private long id;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public Gender getGender() { return g; }
public void setGender(Gender g) { this.g = g; }
@Transient
public boolean isMale() {
return Gender.MALE.equals(g);
}
@Transient
public boolean isFemale() {
return Gender.FEMALE.equals(g);
}
}
このクラスはJPAに供給されると、それが持続gender
してid
ますが、ヘルパーのboolean型メソッドを保持しようとしない-ことなく、@Transient
基本となるシステムエンティティ・クラスがと文句を言うだろうPerson
不足しているsetMale()
とsetFemale()
メソッドひいては持続しないだろうPerson
、すべてで。
目的が異なります:
transient
キーワードと@Transient
と1件の情報:注釈は、二つの異なる目的で持ってシリアライズとで1つの取引永続性を。プログラマーとして、これら2つの概念を1つに統合することがよくありますが、これは一般的に正確ではありません。永続性は、それを作成したプロセスよりも長く存続する状態の特性を指します。シリアライゼーション Javaでは、バイトストリームとしてオブジェクトの状態を符号化/復号化のプロセスを指します。
transient
キーワードは、より強い条件であります@Transient
:
transient
フィールドがキーワードを使用する場合、オブジェクトがバイトストリームに変換されるときにそのフィールドはシリアル化されません。さらに、JPAはtransient
キーワードでマークされ@Transient
たフィールドを注釈を持つものとして扱うため、フィールドもJPAによって永続化されません。
一方、注釈付きフィールド@Transient
のみがしますオブジェクトがシリアライズされたバイトストリームに変換され、それはJPAによって永続化されることはありません。したがって、transient
キーワードは@Transient
注釈よりも強い条件です。
例
これは疑問を投げかけます:なぜ誰かがアプリケーションのデータベースに永続化されていないフィールドをシリアル化したいのですか?現実には、シリアライゼーションは永続化以上の目的で使用されます。エンタープライズJavaアプリケーションでは、分散コンポーネント間でオブジェクトを交換するメカニズムが必要です。シリアライゼーションは、これを処理するための共通の通信プロトコルを提供します。したがって、フィールドは、コンポーネント間通信の目的で重要な情報を保持できます。しかし、同じフィールドは永続性の観点からは価値がない場合があります。
たとえば、最適化アルゴリズムがサーバーで実行されていて、このアルゴリズムの完了に数時間かかるとします。クライアントにとって、最新のソリューションセットを用意することが重要です。したがって、クライアントはサーバーにサブスクライブして、アルゴリズムの実行フェーズ中に定期的な更新を受信できます。これらの更新は、ProgressReport
オブジェクトを使用して提供されます。
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
Solution
クラスは次のようになります。
@Entity
public class Solution implements Serializable{
private static final long serialVersionUID = 1L;
double[][] dataArray;
Properties properties;
}
サーバーはそれぞれのProgressReport
データベースを維持します。サーバーは永続化を気にしませんestimatedMinutesRemaining
が、クライアントは確かにこの情報を気にします。したがって、estimatedMinutesRemaining
はを使用して注釈が付けられ@Transient
ます。ファイナルSolution
がアルゴリズムによって特定されると、それを使用せずにJPAによって直接永続化されProgressReport
ます。
@Unpersisted
。
@Ephemeral
です。Merriam Websterによると、1600年代に短命が最初に英語で印刷されたとき、「これは短期間の発熱、およびその後非常に短い寿命を持つ生物(昆虫や花など)に適用される科学用語でした。その後すぐに、それは、(「はかない快楽」のように)つかの間の、そして短命なものに言及する拡張された感覚を獲得しました。」
transient
フィールドに暗黙的に@Transient
注釈を付けていると見なしていることについて言及していることです。したがって、transient
キーワードを使用してフィールドのシリアル化を防止すると、データベースにも反映されません。
フィールドが永続化されないようにしたい場合は、transientと@Transientの両方が機能します。しかし、問題は、一時的なものがすでに存在するため、@ Transientである理由です。
@Transientフィールドは引き続きシリアル化されるためです!
エンティティを作成し、CPUを消費する計算を行って結果を取得するとします。この結果はデータベースに保存されません。ただし、JMSで使用するエンティティを他のJavaアプリケーションに送信する@Transient
場合は、JavaSEキーワードではなくを使用する必要がありますtransient
。そのため、他のVMで実行されているレシーバーは、時間を節約して再計算することができます。