当扩展类仅包含嵌入集合时,Hibernate省略表

时间:2015-06-18 19:01:12

标签: hibernate inheritance collections hashmap joined-subclass

我目前正在使用继承策略InheritanceType.JOINED。我的扩展类只包含一个String类型的Map,它存储在自己的表中。我想知道是否有可能省略只包含id的扩展类的表。

如果没有直接选项可以省略"请告诉我你将如何对其进行不同的建模。桌子。

该示例显示我有一个基类"属性"它由类" StringMapAttribute"扩展。这个extendend类只包含一个集合。 " StringMapAttribute"的表最后只包含" id"这是" Design Overhead"所以我可以使用继承和模型不同的属性类型。因此,仅具有一个具有单个id列的表是不理想的。

// Base class
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING)
public abstract class Attribute<T> implements Serializable {
  @Id
  @GeneratedValue
  private int id;
  private String name;
  ...
}

// Extended class with embedded map 
@Entity
@Table(name="attribute_string") --> I like not to keep that table
@DiscriminatorValue("STRING")
public class StringMapAttribute extends Attribute<Map<String,String>> {

  @ElementCollection
  @CollectionTable(name= "attribute_string_language",   joinColumns = @JoinColumn(name = "attribute_id")
  )
  @MapKeyColumn(name="language")
  @Column(name = "value")
  private Map<String, String> value = new HashMap<String, String>();
}

感谢您提供任何有用的提示。

1 个答案:

答案 0 :(得分:0)

是的,“DuncanKinnear”的评论是正确的,所以我改用了SINGLE_TABLE策略。

  

是的,但是JOINED策略的缺点是你必须为每个类都有一个单独的表,并且你的StringMapAttribute类没有意义,因为表中没有列(除了ID)。您需要考虑使用SINGLE_TABLE策略。现代关系数据库可以存储稀疏列表(许多NULL列),就像一堆独立的表一样高效,并且您不必将表连接在一起。 - DuncanKinnear