2013-10-11 65 views
2

我有一些表格是有一些共同的列,我認爲創建實體時,我將有實體延伸,所有的映射定義一個類:在Predicate p1 = builder.equal(logWork.get(LogWork_.field1), f1);結果在查詢中使用該如果不能與查詢和實體管理器一起使用,那麼@MappedSuperclass的重點是什麼?

@MappedSuperclass 
public class AbstractLogMaster implements Serializable 
{ 
    @Id 
    @Basic(optional = false) 
    @Column("id") 
    protected long id; 

    @Column("field1") 
    protected String field1; 

    @Column("field2") 
    protected String field2; 

    public long getId() 
    { 
    return id; 
    } 

    public void setId(long id) 
    { 
    this.id = id; 
    } 

    etc... 
} 

@Entity 
@Table(name = "logwork") 
public class LogWork extends AbstractLogMaster implements Serializable 
{ 
    @Column("field3") 
    protected int field3; 

    public int getField3() 
    { 
    return field3; 
    } 
} 

NPE(特別是因爲logWork.get(LogWork_.field1)部分 - 的@StaticMetaModel似乎不具有映射超工作)

望着JPA documentation我發現:

無法查詢映射超類,並且無法在EntityManager或Query操作中使用。您必須在EntityManager或Query操作中使用映射超類的實體子類。映射的超類不能成爲實體關係的目標。映射的超類可以是抽象的或具體的。

這是否意味着映射超類中映射的任何字段都不可用於擴展實體在條件查詢中使用?如果是這樣,將映射放入超類的意義何在?如果沒有,我做錯了什麼?

+1

這已經有一段時間,因爲我使用JPA玩,但我相信這是說,繼承以同樣的方式單獨的靜態元模型映射可以被繼承,但是你不能一般地使用它們來查詢 - 這意味着如果你有一個超類SuperMan和一個擴展它的類,稱它爲SuperChild,你必須對'SuperChild'做所有的查詢。 – StormeHawke

+0

您可以在查詢中使用映射超類的字段,StormeHawke是正確的。問題將出現在'logWork.get(LogWork_.field1)'中。它是如何工作的,它是基於反思? – Mareen

+0

@Mareen LogWork_.field1來自'@StaticMetamodel(LogWork.class)'帶註釋的伴隨類,它爲標準查詢/構建器提供別名。它的作品是「魔術」(實際上,可能是通過反思) – KidTempo

回答

0

我的不好。原來這個問題的答案是@StaticMetamodel帶註釋的伴隨類的「正確」使用。映射的超類都必須有(我已經把每樣東西的實體爲一體的元模型,LogWork_

@StaticMetamodel(AbstractLogMaster.class) 
public final class AbstractLogMaster_ 
{ 
    public static volatile SingularAttribute<AbstractLogMaster, Long> id; 
    public static volatile SingularAttribute<AbstractLogMaster, String> field1; 
    public static volatile SingularAttribute<AbstractLogMaster, String> field2; 
} 

@StaticMetamodel(LogWork.class) 
public final class LogWork_ extends AbstractLogMaster_ 
{ 
    public static volatile SingularAttribute<LogWork, Integer> field3; 
} 
相關問題