混合连接和单个表继承和查询所有对象 [英] mixing joined and single table inheritance and querying for all objects

查看:108
本文介绍了混合连接和单个表继承和查询所有对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个正在使用以下配置的web应用程序(我更改了实体名称):

  @Entity 
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name =animals)
public abstract class Animal {...

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name =type)
public abstract class Mammal extends Animal {...

@Entity
@Table(name =mammals)
@PrimaryKeyJoinColumn(name =mammal_id)
@DiscriminatorValue(value =dog)
public class Dog extends Mammal {...

@Entity
@Table(name =mammals)
@PrimaryKeyJoinColumn(name =mammal_id)
@DiscriminatorValue(value =cat)
公共类Cat延伸Mammal {...

所以我有2个表格:动物和哺乳动物。
这种配置正在工作,除非我完全不了解。
哺乳动物中的继承类型从JOINED变为SINGLE_TABLE,所以猫和狗都存储在哺乳动物表中与哺乳动物表连接在一起。



问题是不可能以多态的方式检索哺乳动物(猫或狗):

 哺乳动物哺乳动物=(哺乳动物)hibernateTemplate .get(Mammal.class,id); 

或者带有单个Hibernate查询的哺乳动物(狗和猫)列表:

 列表< Mammal> list =(List )hibernateTemplate.find(from Mammal); 

我得到:未知实体:哺乳动物,因为哺乳动物不是实体,它只是一个映射的超类。



我尝试了几个配置更改,例如下面的配置。这似乎是有道理的,但在这种情况下,我得到无法加载实体:哺乳动物,因为它寻找表猫和狗(不存在)。

 @Entity 
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name =animals)
public abstract class Animal {...

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name =mammals)
@PrimaryKeyJoinColumn(name =mammal_id)
@DiscriminatorColumn(name =type)
public abstract class Mammal extends Animal {...

@Entity
@DiscriminatorValue(value =dog)
public class Dog扩展Mammal {...

@Entity
@ DiscriminatorValue(value =cat)
公共类Cat扩展哺乳动物{...

因此,总结一下:我想保持webapp的工作方式相同(2个表格:动物和哺乳动物)但同时能够做一个多态的查询:用一个检索哺乳动物(猫和狗)的列表查询。



我希望我已经清楚了,并且提前感谢您提供任何帮助。



另一个尝试:



涉及以下表格的外键循环依赖:

  @实体
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name =animals)
public abstract class Animal {...

@Entity
@Table(name =mammals)
@PrimaryKeyJoinColumn(name =mammal_id)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name =type )
public abstract class Mammal extends Animal {...

@Entity
@Table(name =mammals)
@DiscriminatorValue(value =dog )
public class Dog extends Mammal {...

@Entity
@Table(name =mammals)
@DiscriminatorValue(value =cat)
public class Cat extends Mammal {...


解决方案

你有没有试过 hibernateTemplate.find(来自Mammal )



您的 find 查询需要根据 JPA实体不是表名。

BTW表格通常以单数形式命名 - 它通常会使复杂查询读得更好一些 - 例如 WHERE chicken.id = egg.id


I have a webapp that is working with the following configuration (I changed the entity names):

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "animals")
public abstract class Animal { ...

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Mammal extends Animal { ...

@Entity
@Table(name = "mammals")
@PrimaryKeyJoinColumn(name = "mammal_id")
@DiscriminatorValue(value = "dog")
public class Dog extends Mammal { ...

@Entity
@Table(name = "mammals")
@PrimaryKeyJoinColumn(name = "mammal_id")
@DiscriminatorValue(value = "cat")
public class Cat extends Mammal { ...

So I have 2 tables: animals and mammals. This configuration is working, unless I don't completely understand how. The inheritance type is changed from JOINED to SINGLE_TABLE in Mammal, so cats and dogs are stored in mammals table joined with animals table by mammal_id column.

The problem is that is not possible to retrieve a mammal (cat or dog) in a polymorphic way:

Mammal mammal = (Mammal) hibernateTemplate.get(Mammal.class, id);

or a list of mammals (dogs and cats) with a single Hibernate query:

List<Mammal> list = (List<Mammal>) hibernateTemplate.find("from Mammal");

I get: "Unknown entity: Mammal", because Mammal is not an entity, it is just a mapped super class.

I tried several changes in configuration for example the one below. This seems to make sense, but in that case I got "Could not load entity: Mammal" because it looks for tables cats and dogs (which doesn't exist).

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "animals")
public abstract class Animal { ...

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "mammals")
@PrimaryKeyJoinColumn(name = "mammal_id")
@DiscriminatorColumn(name = "type")
public abstract class Mammal extends Animal { ...

@Entity
@DiscriminatorValue(value = "dog")
public class Dog extends Mammal { ...

@Entity
@DiscriminatorValue(value = "cat")
public class Cat extends Mammal { ...

So, to summarize: I want to keep the webapp working the same way (2 tables: animals and mammals) but at the same time be able to do a polymorphic query: retrieve a list of mammals (cats and dogs) with one query.

I hope I was clear enough and thanks in advance for any help.

ANOTHER TRY:

"Foreign key circularity dependency involving the following tables: "

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "animals")
public abstract class Animal { ...

@Entity
@Table(name = "mammals")
@PrimaryKeyJoinColumn(name = "mammal_id")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Mammal extends Animal { ...

@Entity
@Table(name = "mammals")
@DiscriminatorValue(value = "dog")
public class Dog extends Mammal { ...

@Entity
@Table(name = "mammals")
@DiscriminatorValue(value = "cat")
public class Cat extends Mammal { ...

解决方案

Did you try hibernateTemplate.find("from Mammal") ?

Your find query needs to be in terms of JPA entities not table names.

BTW tables are typically named in the singular - it generally makes complex queries read a bit better - e.g. WHERE chicken.id = egg.id

这篇关于混合连接和单个表继承和查询所有对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆