spring / hibernate实体映射中的子集

时间:2014-06-03 20:04:50

标签: java spring hibernate spring-mvc

在spring / hibernate中,处理需要在不同情况下使用的数据子集的最佳方法是什么?

我有一个spring mvc app,使用hibernate为MySQL中的大型数据库创建一个接口,每个表有数百万行。应用程序中的某些JSP视图只与给定表中可能包含100,000行的给定子集进行交互,这些行总共可能有10,000,000行。我希望视图能够快速检索数据,因此我尝试创建一个包含100,000行的新数据库表,并与新实体匹配以映射到新数据库表。但这可能会导致代码复杂化。什么是更好的方法来获得仅使用数据子集的速度改进?

这是我到目前为止所做的:

@Entity
@Table(name = "conc_dual_key")
public class ConcDualKey {

    @Id
    @Column(name="dualkey")
    private String name;

    @ManyToMany(cascade = {CascadeType.ALL})//
    @JoinTable(name="conc_dual_key_junction_new",
        joinColumns={@JoinColumn(name="dualkey")},
        inverseJoinColumns={
            @JoinColumn(name = "conceptid", referencedColumnName="id", insertable = false, updatable = false),
            @JoinColumn(name="effectiveTime", referencedColumnName="effectiveTime", insertable = false, updatable = false)})
    private Set<Concept> concepts = new HashSet<Concept>();

    //getters and setters
} 

然后,我在数据库中创建了具有不同表映射的实体的副本,以及我创建的包含子集数据的新表:

@Entity
@Table(name = "conc_finding_dual_key")
public class ConcFindingDualKey {

    @Id
    @Column(name="dualkey")
    private String name;

    @ManyToMany(cascade = {CascadeType.ALL})//
    @JoinTable(name="conc_finding_dual_key_junction_new",
        joinColumns={@JoinColumn(name="dualkey")},
        inverseJoinColumns={
            @JoinColumn(name = "conceptid", referencedColumnName="id", insertable = false, updatable = false),
            @JoinColumn(name="effectiveTime", referencedColumnName="effectiveTime", insertable = false, updatable = false)})
    private Set<Concept> concepts = new HashSet<Concept>();

    //getters and setters
} 

2 个答案:

答案 0 :(得分:1)

不要复制表格,而是创建updatable view

答案 1 :(得分:1)

不要重复使用相同的实体将注释与某些xml映射相结合以指定表。要检索使用您为实体而不是类提供的名称。

<entity-mappings
        xmlns="http://java.sun.com/xml/ns/persistence/orm"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
        http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
                 version="2.0">

    <entity name="ConcDualKey" class="ConcDualKey" table="conc_dual_key" />
    <entity name="ConcFindingDualKey " class="ConcDualKey" table="conc_finding_dual_key" />

</entity-mappings>

像这样的东西。您也可以将ConcFindingDualKey设为只读。

映射进入名为orm.xml的文件中,该文件应位于项目的META-INF目录中。 (这是JPA规范中指定的默认位置,您可以将它放在任何位置,但是您必须通过在mapping-file中包含persistence.xml元素来明确告诉hibernate在哪里找到该文件。