JPA에 @Transient 주석이있는 이유는 무엇입니까?


답변:


455

Java의 transient키워드는 필드가 직렬화되지 않음 @Transient을 나타내는 데 사용되는 반면 JPA의 주석은 필드가 데이터베이스에서 지속되지 않아야 함을 나타 내기 위해 사용됩니다. 즉 시맨틱이 다릅니다.


3
예, 의미론이 다릅니다. 그러나 JPA는 왜 이런 식으로 설계 되었습니까?
Dilum Ranatunga

1
잘 모르겠지만 "Pascal Thivent"의 답변을 살펴보십시오.)
Jawher

30
데이터베이스에 데이터를 저장하지 않을 수도 있지만 엔티티의 저장 / 복원에 직렬화를 사용하는 JPA Chaching 시스템에 데이터를 저장하려는 경우에 유용합니다.
Kdeveloper

1
엔티티의 저장 / 복원을 위해 직렬화를 사용하는 "JPA 캐싱 시스템"이란 무엇입니까? JPA 구현은 원하는 방식으로 객체를 캐시 할 수 있으며 직렬화는 시작되지 않습니다.
DataNucleus

@Jawher, 여기서 일시적인 내성이없는 경우 값을 가지지 않거나 해당 속성의 기본값을 삽입합니다.
Satish Sharma

115

그들은 다른 의미를 가지고 있기 때문입니다. @Transient주석는 (비 지속되지로 JPA 제공자를 말한다 transient) 속성을. 다른 하나는 직렬화 프레임 워크에 속성을 직렬화하지 않도록 지시합니다. 당신은 @Transient속성 을 갖고 여전히 직렬화 하고 싶을 수도 있습니다 .


파스칼 답변 주셔서 감사합니다. 귀하의 의견에 따르면 "@Transient 속성을 갖고 직렬화 할 수 있습니다." (내가 찾고 있던 것이 었습니다) 나는 또한 그 반대가 사실이 아니라고 덧붙이고 싶습니다. 변수를 일시적으로 설정하면 지속 할 수없는 것보다 큽니다.
jfajunior

96

다른 사람들이 말했듯이, @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전혀.


@psp 지정되지 않은 동작을 유발하는 이유 / 어떻게 설명 할 수 있습니까? 감사!
taiduckman

@ 40 사양 상태를 표시합니다
psp

7
훨씬 더 많은 전류가 ... 하나 받아 것을 설명대로이 이럴에게 허용 대답을해야한다
Honza 지덱

53

목적이 다릅니다 :

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.


1
그들이 실제로 다른 관심사라면 분명히 뉘앙스를 포착하는 다른 단어가 있습니다. 용어에 과부하가 발생하는 이유는 무엇입니까? 초보자 제안으로 @Unpersisted.
Dilum Ranatunga

4
나는 개인적으로 좋아한다 @Ephemeral. 메리 암 웹스터 (Merriam Webster)에 따르면, 1600 년대에 임시가 영어로 처음 인쇄되었을 때, 그것은 짧은 열병에, 나중에는 매우 짧은 수명을 가진 유기체 (곤충과 꽃)에 적용되는 과학적 용어였습니다. , 그것은 "일시적인 쾌락"에서와 같이, 덧없고 수명이 짧은 것을 언급하는 확장 된 감각을 얻었다.
Austin D

1
이 답변에 대해 내가 좋아하는 것은 JPA가 transient필드가 암시 적으로 @Transient주석을 갖는 것으로 간주한다는 것 입니다. 따라서 transient키워드를 사용하여 필드의 직렬화를 방지하면 데이터베이스에서도 종료되지 않습니다.
neXus

17

필드를 유지하지 않으려면 transient@Transient가 모두 작동합니다. 그러나 문제는 과도 현상 이 있기 때문에 @Transient 가 이미 존재하는 이유 입니다.

@Transient 필드는 여전히 직렬화되므로!

CPU 소비를 계산하여 결과를 얻기 위해 엔티티를 작성한다고 가정하면이 결과는 데이터베이스에 저장되지 않습니다. 그러나 JMS에서 사용할 수 있도록 엔티티를 다른 Java 애플리케이션으로 보내려면 @TransientJavaSE 키워드가 아닌을 사용해야합니다 transient. 따라서 다른 VM에서 실행중인 수신기는 시간을 절약하여 다시 계산할 수 있습니다.


좀 더 명확하게 설명해 줄 수 있습니까?
가혹한 Kanakhara

jpa가 일시적으로 취급하지만 jackson은 그렇지 않은 주석이 있습니까?
Kalpesh Soni

0

나는 "왜"의 질문에 대답하려고 노력할 것입니다. 테이블에 많은 열이있는 거대한 데이터베이스가 있고 프로젝트 / 시스템이 도구를 사용하여 데이터베이스에서 엔티티를 생성하는 상황을 상상해보십시오. (최대 절전 모드 등이 있습니다.) 이제 비즈니스 논리에 의해 유지되지 않는 특정 필드가 필요하다고 가정하십시오. 엔터티를 특정 방식으로 "구성"해야합니다. Transient 키워드는 Java 언어 내에서 작동하는 것처럼 객체에서 작동하지만 @Transient는 지속성 작업에만 관련된 작업에만 응답하도록 설계되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.