簡體   English   中英

使用視圖作為與Hibernate的連接表

[英]Using a view as a join table with Hibernate

我有兩個實體,我想通過一個普通的String加入。 我創建了一個我想用作連接表的視圖。 除了當我嘗試刪除實體時,這一切都正常。 然后Hibernate嘗試從該視圖中刪除當然失敗的視圖。 使用的數據庫是MySQL。

所以我有

@Entity
public class Event {

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

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

我在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;

在事件我添加:

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

和庫存:

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

我用谷歌搜索了一下這個網站 但解決方案並不是那么好(你必須在股票和事件之間使用實體)。

還有其他解決方案嗎?

我可以使用Hibernate Interceptor並覆蓋onPrepareStatement(String sql)並檢查SQL字符串是否包含來自EVENT_STOCK_VIEW的刪除並返回一個虛擬命令。 顯然是我試圖避免的黑客攻擊。

如果沒有連接表,你能不能這樣做? 據我了解,您的關系實際上是只讀的,因此以下方法應該可以正常工作:

@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;
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM