使用@MappedSuperclass时,JPA基本实体在dao层中实例化问题

时间:2018-04-17 18:57:09

标签: java spring entity-framework jpa inheritance

我知道我们无法实例化抽象类,但是我需要在dao层中实例化基本实体类的要求,我不确定哪种解决方法最有效。

以下是我在基础实体中的内容:

@MappedSuperClass 
public abstract class User implements Serializable{
@Id
@Column(name = "USER_ID", unique = true, nullable = false)
private int userId
.......

现在我有两个子实体,它们指向两个具有相同列的不同表

@Entity
@Table(name = "APP_ONE_USER")
public class AppOneUser extends User{
}

@Entity
@Table(name = "APP_TWO_USER")
public class AppOneUser extends User{
}

我的persistence.xml文件看起来像这样

<persistence-unit name="APP_ONE_USER"
    transaction-type="RESOURCE_LOCAL">
    <class>com.mycom.entity.AppOneUser</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
<persistence-unit name="APP_TWO_USER"
    transaction-type="RESOURCE_LOCAL">
    <class>com.mycom.entity.AppTwoUser</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>

我在spring配置中为每个持久性单元创建了两个entityManagerBean实例。在基于外化属性的运行时,我使用一个或另一个持久性单元

调用entityManager
public class EntityManagerProvider {

@PersistenceContext(unitName="APP_ONE_USER")
private EntityManager em1;

@PersistenceContext(unitName="APP_TWO_USER")
private EntityManager em2;


public EntityManager getCurrentEntityManager(String persistenceUnitFlag){

    if(persistenceUnitFlag.equalsIgnoreCase("appOne")){
        return em1;
    }
    return em2;
}

}

在我的DAO实施中

@Autowired     private EntityManagerProvider emProvider;

private @Value("${persistence.unit.flag}") String persistenceUnitFlag;

@PostConstruct
private void EntityManagerProvider(){
    this.manager =  emProvider.getCurrentEntityManager(persistenceUnitFlag);
}

现在在我的服务实现中,我必须实例化此用户基本实体以设置值(因为我必须从传入请求中检索字段),同时实例化 因为基本实体是抽象的,所以我无法实例化。

如果我从基类中删除抽象没有编译错误,但在保存对象时我得到了未知的实体错误

我的DAO方法看起来像这样

public void saveUser(User user) {
    manager.persist(user);

}

0 个答案:

没有答案