我知道我们无法实例化抽象类,但是我需要在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实例。在基于外化属性的运行时,我使用一个或另一个持久性单元
调用entityManagerpublic 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);
}