thl*_*lim 2 inheritance hibernate
我有3个非抽象的持久化类.MyClubUser和HisClubUser类继承自User类.我为每个子类策略使用一个表,即@Inheritance(strategy = InheritanceType.JOINED)对于这些类.
我观察到的是当我对User类进行查询时,生成的SQL使用左外连接HisClubUser和MyClubUser.为什么Hibernate会这样做[加入其他表格]我的关注点只是用户?我的观点是,即使检索到数据,我也无法在MyClubUser或HisClubUser中访问这些属性,因为返回了User实例.此外,与仅查询没有左外连接的User表的查询相比,这是否会导致额外的开销?
谢谢
Hibernate ALWAYS返回实际类型的持久化实体.如果您存储了"MyClubUser",它将作为"MyClubUser"返回,而不是"User".原因很明显 - 如果Hibernate将"MyClubUser"作为"用户"返回并且你再次坚持它,你将失去"MyClubUser"中定义的所有其他属性.
为了做到这一点,Hibernate需要知道实际类型是什么.对于InheritanceType.JOINED策略发现的唯一方法是检查所有在你的继承层次结构表(当然,在技术上它是等于或低于目前的水平加上所有表中的当前树枝高于目前水平的所有表).所以,如果你有一个层次结构,如:
Root
/ \
Node1 Node2
/ \
Node11 Node12
Run Code Online (Sandbox Code Playgroud)
并且你试图从root中选择,Hibernate将在所有表上进行外连接.如果您从Node1中选择,Hibernate将在Node1和Root上进行内连接,在Node11和Node12上进行外连接.不会触及Node2,因为它不是Node1的后代.
就外部联接开销而言 - 是的,这绝对是一个开销,但这是你为加入战略支付的价格.你可以使用鉴别器来避免这种情况,但它有自己的副作用.这种开销是否显着取决于层次结构,索引和许多其他内容的深度和范围.听取KLE的建议并对其进行分析.