Hibernate Entity에 대해 Null Object 패턴 을 구현하고 싶습니다 .
필드 가있는 Person
엔티티가 있다고 가정 해 봅시다 Address
. 어떤 경우에는 사람의 주소가 정의되어야하고 다른 경우에는 정의되지 않을 수 있습니다.
@Entity
class Person {
String name;
@ManyToOne(targetEntity = Address.class)
IAddress address;
public Person(String name, IAddress address) {
this.name = name;
this.address = address;
}
}
interface IAddress {
String getCity();
String getStreet();
}
@Entity
class Address implements IAddress {
@Id
private Integer id;
private String city;
private String street;
public Address(String city, String street) {
this.city = city;
this.street = street;
}
@Override
public String getCity() {
return city;
}
@Override
public String getStreet() {
return street;
}
}
class NullObjectAddress implements IAddress {
@Override
public String getCity() {
return "London";
}
@Override
public String getStreet() {
return "Baker street";
}
}
사람을 구하려고
Person per1 = new Person("Jhon Doe", new Address("Huge village", "main street"));
personRepository.save(per1); //that`s ok
Person per2 = new Person("Jhon Doe", new NullObjectAddress());
personRepository.save(per2); //throws exception
예외는 다음과 같습니다.
org.springframework.orm.jpa.JpaSystemException : 영구 속성 [Person # id]에 대한 리플렉션으로 [private Address.id] 필드에 액세스하는 동안 오류가 발생했습니다. NullObjectAddress @ 3638120f; 중첩 된 예외는 org.hibernate.property.access.spi.PropertyAccessException입니다. 영구 속성 [Person # id]에 대한 리플렉션으로 [private java.lang.Int Person.id] 필드에 액세스하는 동안 오류가 발생했습니다. : NullObjectAddress @ 3638120f
쉬운 방법은 null
필드 값 에 사용 하고 getter 및 setter에서 null 개체를 처리하는 것입니다.
@Entity
class Person {
@ManyToOne(targetEntity = Address.class)
IAddress address;
public Person(String name, IAddress address) {
this.name = name;
setAddress(address);
}
public IAddress getAddress() {
return address == null ? NullObjectAddress.INSTANCE : address;
}
public void setAddress(IAddress address) {
this.address = address instanceof NullObjectAddress ? null : address;
}
}
그러나 JPQL / HQL 쿼리에서는 여전히이를 nullable로 처리해야합니다. 예를 들어 인스턴스 값을 갖는 매개 변수 address is (not) null
대신 사용해야 합니다.address = :address
:address
NullObjectAddress
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다