program story

Hibernate는 getter가있을 때 항상 setter가 필요합니까?

inputbox 2020. 12. 25. 09:44
반응형

Hibernate는 getter가있을 때 항상 setter가 필요합니까?


@Column둘 다 주석이 달린 Hibernate getter 메소드가 있습니다 @Basic.

해당 세터가 없으면 예외가 발생합니다. 왜 이런거야?

우리의 경우 (DB에 저장하기 위해) getter에서 반환 된 값을 파생하고 setter는 기능적 목적이 없습니다. 그래서 우리는 오류 조건을 피할 수있는 빈 메서드를 가지고 있습니다.


다른 사람들이 언급했듯이 속성 getter 메서드에 주석을 달면 Hibernate는 데이터베이스에서 값을 읽을 때 setter를 사용합니다. 기본적으로 Hibernate는 데이터베이스에 쓰는 모든 것이 결국 데이터베이스에서 읽어야한다고 가정합니다. 이것은 getter에 주석을 달면 데이터베이스에서 객체를 읽을 때 setter를 호출해야 함을 의미합니다.

setter를 비공개로 만들 수 있습니다 (Hibernate는 리플렉션을 사용하여 setter에 액세스합니다). 이것은 관계형 매핑을 위해 Hibernate를 사용하면서 클래스의 계약을 보존하는 좋은 방법입니다.

필드가 클래스의 다른 속성에서 파생 된 경우 데이터베이스에 저장하는 이유는 무엇입니까? @Transient주석을 사용 하여 데이터베이스에 저장하면 안되는 필드를 표시 할 수 있습니다 . @Formula주석을 사용하여 Hibernate가 필드를 파생하도록 할 수도 있습니다 (데이터베이스로 보내는 쿼리의 공식을 사용하여 수행합니다).


클래스에 @Entity(access = AccessType.FIELD)주석을 달고 속성에 주석을 달아야합니다. 이것은 당신의 문제를 해결할 것입니다. setter는 리팩토링을 지원하는 가장 좋은 방법입니다. 그리고 거기에 작은 세터가 있다는 것이 문제입니다.


access="field"setter를 사용하지 않으려면 설정하십시오 .

<class name="com.demo.hibernate.Country" table="country">
  <id name="countryId" column="id" type="int">
    <generator class="increment" />
  </id>
  <property name="name" column="name" access="field" type="string" />
  <property name="countryCode" column="country_code" access="field" type="string" />
</class>

Hibernate는 setDB에서 읽고있는 엔티티를 초기화하는 방법을 사용 합니다.

당신이 개체 필드의 액세스 수식 할 경우 어쩌면, default또는 protected또는 public다음 최대 절전 모드를 직접 세터를 사용하지 않고 필드를 초기화한다 (나는 그것에 대해 뭔가를 읽을 수 있지만 나는 확실히 작동하는지 아니에요). 그러나 setter를 사용하는 것이 훨씬 더 선호되는 방법입니다.


setter를 사용하지 않고 private 속성을 사용한다면 Hibernate는 리플렉션으로 Fields를 검색하고 field.setAccessible (true)를 수행해야합니다. 저는 Hibernate가 그렇게한다고 생각하지 않습니다.

Hibernate에게 그렇게하라고 말할 수 있는지는 잘 모르겠지만, 제가 기억하는 한 기본 설정은 setter를 사용하고 있습니다 ... 로그 / sysout을 세트에 넣으면 setter를 사용하는 것을 볼 수 있습니다.

참조 URL : https://stackoverflow.com/questions/2676689/does-hibernate-always-need-a-setter-when-there-is-a-getter

반응형