2015-04-05 46 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