使用视图作为 Hibernate 的连接表

Posted

技术标签:

【中文标题】使用视图作为 Hibernate 的连接表【英文标题】:Using a view as a join table with Hibernate 【发布时间】: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 并返回一个虚拟命令。显然是我试图避免的黑客攻击。

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

你不能在没有连接表的情况下做到这一点吗?据我了解,您的关系实际上是只读的,因此以下方法应该可以正常工作:

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

【讨论】:

如果这个例子像我上面展示的那样简单,那就行了。不幸的是,我正在创建的视图在 where 子句中有更多限制。那么您的解决方案将不再有效。

以上是关于使用视图作为 Hibernate 的连接表的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate自动创建表

如何配置 Hibernate 5 以强制 Mysql 使用 Innodb 引擎创建表?

Hibernate(十三)迫切内连接fetch

Hibernate笔记

websphere启动报/WEB-INF/applicationContext-orm- hibernate.xml]: Could not resolve placeholder 'hibe

如何使用 JPA 和 Hibernate 在非主键上连接表