자바 transient
키워드가 있습니다. JPA가 @Transient
기존 Java 키워드를 사용하는 대신 왜 JPA 를 사용합니까?
답변
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
.
답변
필드를 유지하지 않으려면 transient 및 @Transient가 모두 작동합니다. 그러나 문제는 과도 현상 이 있기 때문에 @Transient 가 이미 존재하는 이유 입니다.
@Transient 필드는 여전히 직렬화되므로!
CPU 소비를 계산하여 결과를 얻기 위해 엔티티를 작성한다고 가정하면이 결과는 데이터베이스에 저장되지 않습니다. 그러나 JMS에서 사용할 수 있도록 엔티티를 다른 Java 애플리케이션으로 보내려면 @Transient
JavaSE 키워드가 아닌을 사용해야합니다 transient
. 따라서 다른 VM에서 실행중인 수신기는 시간을 절약하여 다시 계산할 수 있습니다.
답변
나는 “왜”의 질문에 대답하려고 노력할 것입니다. 테이블에 많은 열이있는 거대한 데이터베이스가 있고 프로젝트 / 시스템이 도구를 사용하여 데이터베이스에서 엔티티를 생성하는 상황을 상상해보십시오. (최대 절전 모드 등이 있습니다.) 이제 비즈니스 논리에 의해 유지되지 않는 특정 필드가 필요하다고 가정하십시오. 엔터티를 특정 방식으로 “구성”해야합니다. Transient 키워드는 Java 언어 내에서 작동하는 것처럼 객체에서 작동하지만 @Transient는 지속성 작업에만 관련된 작업에만 응답하도록 설계되었습니다.