Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何使用通用dao和服务层获取特定的继承实体_Spring_Hibernate_Spring Mvc_Jpa_Orm - Fatal编程技术网

Spring 如何使用通用dao和服务层获取特定的继承实体

Spring 如何使用通用dao和服务层获取特定的继承实体,spring,hibernate,spring-mvc,jpa,orm,Spring,Hibernate,Spring Mvc,Jpa,Orm,在从事spring mvc项目时,我面临以下问题: 我有UnitAppUser、VStanAppUser和RjuAppUser实体类,它们扩展了用户实体。用户实体存储一些一般信息。其余的继承实体存储对特定实体的引用(UnitAppUser具有字段单位类型,VStanAppUser具有VStan类型,依此类推)。 这是我的父用户实体 @Entity @Inheritance(strategy=InheritanceType.JOINED) @Table(name="app_user") p

在从事spring mvc项目时,我面临以下问题: 我有UnitAppUser、VStanAppUser和RjuAppUser实体类,它们扩展了用户实体。用户实体存储一些一般信息。其余的继承实体存储对特定实体的引用(UnitAppUser具有字段单位类型,VStanAppUser具有VStan类型,依此类推)。 这是我的父用户实体

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name="app_user")
    public class User implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 6628717324563396999L;

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

@NotEmpty
@Column(name="SSO_ID", unique=true, nullable=false)
private String ssoId;

@NotEmpty
@Column(name="PASSWORD", nullable=false)
private String password;

@NotEmpty
@Column(name="FIRST_NAME", nullable=false)
private String firstName;

@NotEmpty
@Column(name="LAST_NAME", nullable=false)
private String lastName;

@NotEmpty
@Column(name="EMAIL", nullable=false)
private String email;
}
以下是我的孩子课程:

@Entity
@Table(name = "unit_app_user")
public class UnitAppUser extends User implements Serializable {

@JoinColumn(name = "UNITWORK", referencedColumnName = "ID")
@ManyToOne(optional = false)
private UnitDepart unitdepart;

public UnitDepart getWorkat() {
    return unitdepart;
}

public void setWorkat(UnitDepart unitdepart) {
    this.unitdepart = unitdepart;
}
}
@Entity
@Table(name="rju_app_user")
public class RjuAppUser extends User implements Serializable{

@JoinColumn(name = "workrju", referencedColumnName = "id")
@ManyToOne(optional = false)
private Rju rju;
public Rju getWorkat() {
    return rju;
}
public void setWorkat(Rju rju) {
    this.rju = rju;
}
}
最后是我的VStan实体:

@Entity
@Table(name="vstan_app_user")
public class VstanAppUser extends User implements Serializable{

@JoinColumn(name = "WORKSTATION", referencedColumnName = "kod")
@ManyToOne(optional = false)
private Vstan vstan;

public Vstan getWorkat() {
    return vstan;
}

public void setWorkat(Vstan vstan) {
    this.vstan = vstan;
} 
}
如何编写通用dao和服务以获得特定实体? 因此,我应该有这样的东西

userService.findBySSOId("somessoId").getWorkat() //should return UnitDepart, Rju or VStan

您是否在数据库中使用了继承?然后Hibernate就可以做剩下的事情了。在用户实体中使用鉴别器应该可以做到这一点。但是,在调用getWorkAt()之前,您仍然需要将UserService返回的对象强制转换为正确的类型。由于Java的静态类型,我不知道如何解决这个问题。我可以通过以下方式获得类:userService.findBySSOId(“somessoId”)。getClass()提供了我想要的类。但是我想要object因为您想要让所有用户实现一个方法
getWorkat()
返回所有不同类型的
Vstan、unitdeep、Rju
,所以看起来
Vstan、unitdeep、Rju
应该形成一个继承层次结构,而不是
User
s。然后您只需要一个
用户
类,该类与一个基类
部门
(或
公司
,或任何
Vstan、UnitDepart、Rju
相关联)还有,
Vstan、UnitDepart、Rju确实不同吗?看起来你想互换使用它们。也许您建模为独立类的内容真的应该在
部门
中的
部门名称
枚举字段中提取出来?