2013-06-08 8 views
0

저는 Hibernate를 처음 사용하기 때문에이 실망한 문제를 다루고 있습니다. 두 클래스가 있습니다 : LocationAddress. Address은 엔터티이며 Location 기본 키에 외래 키가 있습니다. 그래서 여기 LocationOneToOne을 업데이트 한 후 NullPointerException이 발생했습니다.

public class Location implements Serializable { 
//Rest of code omitted 
@OneToOne(mappedBy = "location", cascade = CascadeType.ALL) 
    public Address getAddress() { 
     return address; 
    } 
} 

Address

public class Address implements Serializable { 
    //Rest of code ommitted 
    @OneToOne 
    @JoinColumn(name = "LOCATION_FK") 
    public Location getLocation() { 
     return location; 
    } 
} 

나는 위치 개체의 주소를 업데이트하기 위해 노력하고있어입니다하지만 내가 추측 일이 아닙니다.

public void updateAddress(Location location, Address address) { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction tx = session.beginTransaction(); 

    tx.begin(); 
    Location persistedLocation = (Location) session.get(Location.class, location.getId()); 
    Address persistedAddress = persistedLocation.getAddress(); 
    session.delete(persistedAddress); 
    persistedLocation.setAddress(address); 
    tx.commit(); 

    session.close(); 
} 

여기 내 단위 테스트 내가 잘못 뭐하는 거지

//Setting variables 
Location location = new Location(); 
Address address = new Address("123456", "TOWN", "CITY", 12345); 
LocationDAO instance = new LocationDAO(); 

//Add the first location 
boolean result = instance.addLocation(location, address); 
assertTrue(result); 

//Get it back from database 
Location persistedLocation = instance.getLocations().get(0); 
assertEquals(location.getAddress().getAddressLine(), persistedLocation.getAddress().getAddressLine()); 

Address newAddress = new Address("987654321", "Chicago", "IL", 11234); 

instance.updateAddress(persistedLocation, newAddress); 
persistedLocation = instance.getRentalLocations().get(0); 

//Fails on the line below 
//assertEquals(newAddress.getAddressLine(), persistedLocation.getAddress().getAddressLine()); 

입니까? 감사합니다.

+0

당신이 더 도움이 될 수 있어요 예외 스택 트레이스 :

당신은 당신의 DAO에이 줄을해야합니다. – Lion

+0

@Lion ok one sec – Andy

답변

1

연관성은 "mappedBy"Address.location입니다. 이것은 Hibernate가 연관의이면 (소유자 측)만을 고려하고 다른면 (반대면)을 무시한다는 것을 의미한다.

그러나 코드는 역변환 만 초기화하고 소유자 측 초기화를 무시합니다. 따라서 연관성은 데이터베이스에 유지되지 않습니다.

address.setLocation(persistedLocation); 
+0

고맙습니다. 이 질문에 많은 질문을 받지만 CascadeType.ALL은 어떨까요? 자동으로 감지하면 안됩니까? – Andy

+0

나는 그것이 내가 혼란스러워하는 곳이라고 생각한다. – Andy

+1

CascadeType.ALL은 위치의 모든 작업 (병합, 유지, 제거 등)이 주소에서도 자동으로 수행됨을 의미합니다. 해당 위치에서 아무런 조작을하지 마십시오. 그리고 그렇게해도 자동으로 주소 필드를 초기화하지 않습니다. 당신은 그 책임이 있습니다. –

관련 문제