2011-12-28 3 views
0

JPA에서보기에서 엔티티를 읽은 다음 테이블을 업데이트 할 수 있습니까? 우리는 SuppliersInvoice_VW에서 읽어 엔티티가JPA :보기 업데이트 테이블에서 읽기

Sample Schema

:

는 예제를 제공합니다. 이보기 및 연관된 엔티티에는 InvoiceNo, SupplierCode, SupplierName 및 값이 포함됩니다.

송장 번호 : : 1234
공급 업체 : Joes의 '하드웨어
가 가 값 : 50 그 값이 509이 될 것을 깨닫게

, 그래서 그가 업데이트

사용자는이 라인을 따라 뭔가를 볼 수 없습니다 이에 따라

송장 번호 : 1234
공급 업체 : Joes의 '하드웨어
값 : 509

그러면 SuppliersInvoice 엔터티에 대한 업데이트가 트리거됩니다.

@Table("SuppliersInvoice_vw")은 SuppliersInvoice_vw에서 데이터를 읽음을 나타내지 만, 이는 해당 뷰를 통해 업데이트된다는 의미이기도합니다.

(SuppliersInvoice) 테이블을 JPA는 (SuppliersInvoice_vw) 뷰에서 읽을 수 있도록하고 업데이트 할 수있는 방법이 있습니까?

대체 전략은보기를 업데이트하는 것입니다. 그러나 나는 항상 그렇게 권고하지 않았습니다. 이 조언에는 성과 기반이 있으며, '보기를 통해 업데이트 할 때 무엇이 ​​잘못 될 수 있는지 알고 있어야합니다.

+0

사용자가보기 (예 : 웹 페이지)에서 무언가를 변경하면 어떻게 든 JPA가 변경 사항을 직접 감지하고 데이터베이스를 업데이트한다는 것을 의미합니까? –

+0

@ Mr.J4mes 아니요 사용자 인터페이스에 관심이 없습니다. 이것은 JPA가 뷰에서 읽고 테이블을 갱신 할 수 있는지를 /습니다. –

+1

아니요. 해당 상황에 대한 JPA의 내용이 없습니다. – DataNucleus

답변

1

JPA로 투명하게 원하는 것을 정확하게 수행 할 수 있다고 생각하지 않습니다.

JPA 사양은 단일 @Table/@Entity만을 허용합니다. 아마도 이것을 다루기위한 가장 쉬운 (그리고 가장 휴대하기 쉬운) 방법은 두 개의 별도의 @Entity 클래스를 가지는 것입니다. 하나는보기 용이고 다른 하나는 비슷한 속성으로, 읽고 쓰는지 여부에 따라 어떤 것을 사용할 지 선택하십시오 또는 쓰기.

속성이 일치하면 BeanUtils.copyProperties 커먼을 사용하여보기 가능한 개체를 초기화 할 수 있습니다.

기본적으로 데이터베이스보기에 매핑되는 읽기 전용 엔터티는 DTO와 유사하므로 사용자가이를 처리하게됩니다.

1

보기/테이블과 엔티티에서 이전과 동일한 문제가 발생했습니다. 어떤 백엔드 데이터베이스를 사용하고 있는지 모르겠지만 제 경우에는 PostgreSQL 9.x를 실행하고있었습니다. 이 문제를 해결하기 위해 필자는 데이터베이스에서 뷰에 INSERT 또는 UPDATE를 할 수있는 트리거를 만든 다음 트리거를 통해 뷰 뒤의 기본 테이블을 적절히 업데이트합니다. 그렇게하면 SuppliersInvoice 엔티티 개체를 업데이트하고 평소와 같이 JPA를 사용하여 변경 내용을 유지할 수 있지만 백엔드 데이터베이스는 제공하는 업데이트를 기반으로 실제 테이블을 적절하게 업데이트합니다.

PostgreSQL 9.1의 INSERT/UPDATE/DELETE rules 설명서에 대한 링크가 있으므로 직접 볼 수 있습니다.

관련 문제