2015-04-05 20 views
0

我有兩類:映射兩個類來在休眠表,而不插入字段表

@Entity 
@Table(name="shops") 
public class Shops { 
    private Integer id; 
    private String name; 
    // ... 
} 

@Entity 
public class ShopsPlus extends Shops { 
    public Double latitude; 
    public Double longitude; 
    // ... 
} 

類「商店」,以反映「商店」表(正常實體)被使用。 第二類('ShopsPlus')包含幾個附加字段,它們不在第一個類中,並且用於從計算字段查詢中獲取結果。

實施例:

Query query = session.createSQLQuery("SELECT shops.id, shops.name 
             COS(?) AS latitude, /*example*/ 
             SIN(?) AS longitude /*example*/ 
             FROM shops 
             WHERE localities.name = ? 
             AND localities.id = shops.locality_id;") 
       .addEntity(ShopsPlus.class) 
       .setString(0, a.toString()) 
       .setString(1, a.toString()) 
       .setString(2, cityName); 
List<Shops> shops = query.list(); 

之後,表中有三個過量字段: '緯度', '經度' 和 'DTYPE'。

如何禁止班級「ShopsPlus」對錶格進行更改,但爲此留下了「商店」的機會?

回答

0

由於您使用Hibernate,因此您可以使用@org.hibernate.annotations.Immutable註釋ShopsPlus

我不知道是否有一個JPA標準方法來標記一個實體爲只讀/不可變的,但是,例如,EclipseLink有@ReadOnly爲此目的。

+0

只有在清除繼承時它纔有效。 但同時也是最好的選擇。謝謝! – Alexiuscrow 2015-04-06 00:09:22

0

我認爲這可以爲你工作。只需爲列定義可插入和可更新:

@Entity 
public class ShopsPlus extends Shops { 

    @Column(insertable = false, updatable = false) 
    public Double latitude; 

    @Column(insertable = false, updatable = false) 
    public Double longitude; 
    // ... 
} 

@Entity 
@Table(name="shops") 
public class Shops { 
    private Integer id; 
    private String name; 

    @Column(insertable = true, updatable = true) 
    public Double latitude; 

    @Column(insertable = true, updatable = true) 
    public Double longitude; 
    // ... 
} 
+0

我試過這種方式。但它不起作用。附: 「商店」不應包含「緯度」和「經度」字段。 – Alexiuscrow 2015-04-05 23:41:09