回答:
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で実行されているレシーバーは、時間を節約して再計算することができます。