【发布时间】:2011-07-16 13:10:31
【问题描述】:
我有两个实体,我想通过一个公共字符串加入它们。 我创建了一个要用作连接表的视图。除了我尝试删除实体时,这一切都很好。 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;
}
我用谷歌搜索了一下,发现了这个site。 但是解决方案并不是那么好(您必须在股票和事件之间使用实体)。
还有其他解决方案吗?
我可以使用 Hibernate Interceptor 并覆盖 onPrepareStatement(String sql) 并检查 SQL 字符串是否包含 delete from EVENT_STOCK_VIEW 并返回一个虚拟命令。显然是我试图避免的黑客攻击。
【问题讨论】:
-
你找到解决办法了吗?
标签: java mysql hibernate jakarta-ee view