我想通过一个普通的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;
}
我用Google搜索了一下,发现了site。 但解决方案并不是那么好(你必须在股票和事件之间使用实体)。
还有其他解决方案吗?
我可以使用Hibernate Interceptor并覆盖onPrepareStatement(String sql)并检查SQL字符串是否包含从EVENT_STOCK_VIEW中删除并返回一个虚拟命令。显然是我试图避免的黑客攻击。
答案 0 :(得分: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;
}