2016-01-28 170 views
0

如何扩展一个实体与另一个实体,但它们都指向同一个表?可能吗 ?该结构是这样的:JPA:实体与实体的扩展

@Entity 
@Table(name = "users") 
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") 
public class User implements Serializable{ 
    private int id; 
    private String name; 
} 

@Entity 
@Table(name = "users") 
@NamedQuery(name="SubUser.findAll", query="SELECT su FROM SubUser su") 
public class SubUser extends User { 

    @Override 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int getId() { 
     return super.getId(); 
    } 

    //- Other fields and getter setter 

} 

我试过这样Extend JPA entity to add attributes and logic

,但我得到这个例外

org.hibernate.mapping.SingleTableSubclass cannot be cast to org.hibernate.mapping.RootClass 

更新1

我已经把@Id为SubUser,因为@Entity显示此例外

The entity has no primary key attribute defined

+0

ID必须在基础机构指定,并且它不是在你的榜样。只有当它是MappedSuperclass时,才可以从基类中省略Id。继承定义用于继承关系中的类的表,而不仅仅指定表! –

回答

1
  • 的@Inheritance注解添加到超类
  • 实现Serializable
  • 添加id的吸气剂(你并不需要一定是一个setter)
  • id应该是Integer ,而不是int,这样就可以用null表示未分配的ID。

代码:

@Entity 
@Table(name = "users") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    private String name; 

    public Integer getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 


@Entity 
public class SubUser extends User { 

} 
+0

我仍然有这个错误'org.hibernate.mapping.SingleTableSubclass不能转换为org.hibernate.mapping.RootClass' – Mrye

0

任何基本JPA的文档会描述继承,鉴别和使用@Id

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="DISCRIM", discriminatorType=DiscriminatorType.STRING) 
@DiscriminatorValue("User") 
@Table(name="users") 
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") 
public class User implements Serializable{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    private String name; 
} 

@Entity 
@DiscriminatorValue("SubUser") 
@NamedQuery(name="SubUser.findAll", query="SELECT su FROM SubUser su") 
public class SubUser extends User { 

}