[英]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.