2011-03-16 2 views
2

나는 공통 String을 통해 결합하고자하는 두 개의 엔티티가있다. 조인 테이블로 사용하려는 뷰를 만들었습니다. 이 엔티티를 삭제하려고 할 때를 제외하고는 모두 잘 작동합니다. Hibernate는 그 뷰에서 삭제하려고 시도한다. 사용 된 데이터베이스는 MySQL입니다.Hibernate에서 뷰를 조인 테이블로 사용

@ManyToOne(fetch=FetchType.LAZY) 
@JoinTable(name="EVENT_STOCK_VIEW", 
    [email protected](name="EVENT_ID"), 
    [email protected](name="STOCK_ID",updatable=false,insertable=false)) 
public Stock getStock(){ 
    return this.stock; 
} 

및 재고를 :

는 그래서 내가 추가 한 MySQL의 이벤트에

DROP VIEW IF EXISTS EVENT_STOCK_VIEW; 
create view EVENT_STOCK_VIEW AS 
SELECT EVENT.EVENT_ID, STOCK.STOCK_ID 
FROM EVENT, STOCK 
where STOCK.PRODUCT_ID = EVENT.PRODUCT_ID; 

에서보기를 만든

@Entity 
public class Event { 

    ... 
    String productId; 
    Date eventDatetime; 
    ... 
} 

@Entity 
public class Stock { 
    ... 
    String productId; 
    ... 
} 

있어

@OneToMany(fetch=FetchType.LAZY) 
    @JoinTable(name="EVENT_STOCK_VIEW", 
    [email protected](name="STOCK_ID",updatable=false,insertable=false),  [email protected](name="EVENT_ID",updatable=false,insertable=false)) 
    @OrderBy("eventDatetime DESC") 
    public List<Event> getEvents(){ 
     return events; 
} 

나는 조금 봤는데이 site을 발견했습니다. 하지만 해결책은 정말 좋지 않습니다. 주식과 이벤트 사이에서 엔티티를 사용해야합니다.

다른 해결책이 있습니까?

하이버 네이트 인터셉터를 사용하고 onPrepareStatement (String sql)을 덮어 쓰고 SQL 문자열에 EVENT_STOCK_VIEW의 삭제가 포함되어 있는지 확인하고 더미 명령을 반환 할 수 있습니다. 분명히 피하려고하는 해킹입니다.

답변

0

조인 테이블을 사용하지 않아도 될 수 있습니까? 내가 이해하는 한 당신의 관계는 효과적으로 읽기 전용이므로 다음 접근 방식이 잘 작동해야합니다.

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "productId", 
    referencedColumnName = "productId", insertable = false, updateable = false) 
public Stock getStock(){ 
    return this.stock; 
} 

... 

@OneToMany(fetch=FetchType.LAZY, mappedBy = "stock") 
@OrderBy("eventDatetime DESC") 
public List<Event> getEvents(){ 
    return events; 
} 
+0

위의 예제처럼 쉽습니다. 불행히도 내가 만들고있는 뷰에는 where 절에 몇 가지 제한이 있습니다. 그러면 솔루션이 더 이상 작동하지 않습니다. – Ben

관련 문제