2011-08-15 5 views
5

최대 절전 모드를 구성하는 방법을 이해하는 데 도움을 줄 수 있습니까?최대 절전 모드 - 부모만을 유지하는 방법, 아이들을 그대로 유지하는 방법

"실"의 목록이있는 상위 실체 "아파트"가 있습니다. "Appartment"를 편집 할 수있는 양식이 있습니다. 그 양식 내에서 정보를 얻기 위해 "Room"을 모두 나열했습니다. 객실은 별도의 양식으로 추가 및 편집됩니다.

그래서 내가 false로 lazyloading를 설정 한 아파트 형태의 객실을 나열하고 있기 때문에 :

@OneToMany 
@JoinColumn (name = "appartmentId") 
@LazyCollection (LazyCollectionOption.FALSE) 
private List<Room> room; 

하지만 그것을 아파트를 편집하고 저장하는 경우, 모든 아파트 객실 갑자기 dissappear. 데이터베이스에서는 삭제되지 않지만 참조 해제됩니다 (appartmentId = null에서와 같이).

어떻게 내 Appartment 개체를 유지하기 위해서 최대 절전 모드를 구성 할 수 있습니까? 그리고 아이들을 만지지 마십시오.

이 내 저장 - 작업입니다 :

public String save() throws Exception { 
    boolean isNew = (appartment.getAppartmentId() == null); 

    appartment = appartmentManager.save(appartment); 

    String key = (isNew) ? "appartment.added" : "appartment.updated"; 
    saveMessage(getText(key)); 

    return SUCCESS; 
} 
+0

'Appartment' 객체를 저장하기 전에 재구성하고 있습니까? 명시 적으로 또는 새로운 빈 목록을 작성하여 목록에서'Room'을 제거하는 것처럼 보입니다. – Jeremy

+0

방금 ​​위의 save-metode를 추가했습니다. 당신이 볼 수 있듯이 나는 그것을 저장하기 전에 appartment 객체에 아무 것도하지 않는다. – user829237

+0

'appartment'는 어디에서 왔는가? (참고 : 철자가있는 아파트 * ;-) – Jeremy

답변

3

이것은 매우 간단합니다. 자녀를 다시 채우거나 별도의 DTO를 만들 필요가 없습니다.

자식을 지속하지 않으려면 joinable = false, updatable = false를 joincolumn 주석에 추가하십시오. 이와 같이 :

@OneToMany 
@JoinColumn (name = "appartmentId", insertable = false, updatable = false) 
@Fetch(value = FetchMode.JOIN) 
private List<Room> room; 
+0

고마워요! 내가 원한거야. 쉽고, 깨끗하고 직선적 인 포인트! – user829237

+0

@ user829237 : 이것은 방의 목록에 방을 추가하여 아파트에 방을 추가 할 수 없음을 의미합니다. –

+0

그래, 알아,하지만 당장은 ... – user829237

-2

대신 DTO들 사용을 고려, 지속적 엔티티를 사용하는 (당신이 웹 페이지의 경우 페이지 모델을 호출 할 수 있습니다). 원하는 정보를 표현하고 원하는 형식으로 표시 할 수있는 유연성을 제공합니다. 그러나 당신은 이것을 지불해야합니다 - 당신은 당신의 시스템에 새로운 클래스를 추가하고 엔티티를 DTO로 변환하는 방법을 찾아야합니다.

+0

충분할 때 두 개의 매핑 레이어가있을 이유가 없습니다. – Jeremy

+0

매핑 레이어에 대해서는 아무 말도하지 않았습니다. DTO/VO는 목적에 따라 데이터를 편리하게 묘사하거나 전송하기위한 계층입니다. 일반적으로 모든 것을 영구적으로 처리하는 것만으로는 충분하지 않습니다. 특정 목적을 위해 특별히 정보를 전달하는 클래스가 있어야합니다. –

+0

충분히 공정하지만 사실은 그 질문과 관련이 없습니다. – Jeremy

1
  1. 매핑에서 지연 가져 오기를 비활성화하지 마십시오. 성능 조정을 위해 fetching strategies을 사용하십시오.
  2. Hibernate는 아무런 방도없는 아파트를 저장/업데이트하라는 명령을 내린 경우에만 그 아파트를 제거합니다.
+0

고마워요! 1. 그냥 가져 오기 전략을 구현하고 잘 작동합니다. 2. 저장 조치가 호출되면 appartment-object에서 모든 룸이 제거됩니다. DB를 호출하여 방 목록에 다시 채우기 위해 너무 불필요한 것처럼 보입니다. 그렇게하면 appartment를 지속 할 때 손댈 필요가 없습니다. 이게 진짜로 있어야하는 방법인가요? – user829237

+0

새 인스턴스를 만들고 수동으로 기본 키 속성을 설정 한 다음 저장하려고한다고 가정합니다. 그것은 여러 가지 다른 방식으로 실패 할 운명입니다. 엔티티를 업데이트하는 올바른 방법은 먼저 엔티티를로드 한 다음 트랜잭션 내에서 엔티티를 변경하는 것입니다. –

+0

만들려고하는 점은 다음과 같습니다. 단지 appartment-object를 업데이트하려고합니다. 이것은 하나의 db-statement (update appartment set .... 등)와 동일합니다. 모든 자식을로드 할 필요는 없습니다. 자식이 변경되지 않은 채로 남아있을 때 부모를 저장할 수 있습니다. – user829237

관련 문제