답변:
Java의 transient
키워드는 필드가 직렬화되지 않음 @Transient
을 나타내는 데 사용되는 반면 JPA의 주석은 필드가 데이터베이스에서 지속되지 않아야 함을 나타 내기 위해 사용됩니다. 즉 시맨틱이 다릅니다.
그들은 다른 의미를 가지고 있기 때문입니다. @Transient
주석는 (비 지속되지로 JPA 제공자를 말한다 transient
) 속성을. 다른 하나는 직렬화 프레임 워크에 속성을 직렬화하지 않도록 지시합니다. 당신은 @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
있지만, 도우미 부울 방법을 유지하려고하지 않습니다 -하지 않고 @Transient
엔터티 클래스는 불평을주는 기본 시스템이 Person
없는 setMale()
및 setFemale()
지속되지 것 때문에 방법과 Person
전혀.
목적이 다릅니다 :
transient
키워드와 @Transient
하나의 거래 : 주석은 두 개의 서로 다른 목적을 가지고 직렬화 와 하나의 거래 지속성을 . 프로그래머로서 우리는 종종이 두 개념을 하나로 결합하지만 일반적으로 정확하지는 않습니다. 지속성 은 상태를 생성 한 프로세스보다 오래 지속 되는 상태의 특성을 나타냅니다. 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에서 실행중인 수신기는 시간을 절약하여 다시 계산할 수 있습니다.