1

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

如果不存在“省略”表格的直接选项,请告诉我您将如何对其进行不同的建模。

该示例显示我有一个基类“Attribute”,它由类“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>();
}

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

4

1 回答 1

0

是的,“DuncanKinnear”的评论是正确的,所以我切换到 SINGLE_TABLE 策略。

是的,但是 JOINED 策略的缺点是您必须为每个类和您的 StringMapAttribute 类有一个单独的表,因为表中没有列(除了 ID),所以这没有意义。您需要考虑使用 SINGLE_TABLE 策略。现代关系数据库可以像存储一组单独的表一样有效地存储稀疏列的表(许多 NULL 列),并且不必将表连接在一起而对性能造成影响。——邓肯金尼尔

于 2015-07-19T15:38:59.007 回答