我目前正在使用继承策略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>();
}
感谢您提供任何有用的提示。
答案 0 :(得分:0)
是的,“DuncanKinnear”的评论是正确的,所以我改用了SINGLE_TABLE策略。
是的,但是JOINED策略的缺点是你必须为每个类都有一个单独的表,并且你的StringMapAttribute类没有意义,因为表中没有列(除了ID)。您需要考虑使用SINGLE_TABLE策略。现代关系数据库可以存储稀疏列表(许多NULL列),就像一堆独立的表一样高效,并且您不必将表连接在一起。 - DuncanKinnear