1

我有两个从抽象类继承并具有父子关系的类。

所以我使用注释 OneToMany 和 ManyToOne 但子类中的父实体始终为空。有人可以帮我吗,我花了几个小时在谷歌上搜索并测试了许多没有成功的conf。

这些是我的课程中的代码:

public @Table(name="flowentity") @Entity abstract class FlowEntity {

final static Logger log = LoggerFactory.getLogger(FlowEntity.class);

//Globals informations concerning the flow state
private @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Integer flowId = 0;
private String flowName;

private @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
        Set<PeopleEntity> actorSet = new HashSet<>();


//Global parameters for most of flows
//Organizational parameters
private @OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
        @JoinColumn(name="organisationalEntity_Id")
        OrganisationalEntity organisationalEntity;

...

public @Table(name="ams_newCPEntity") @Entity class NewMultiCPEntity  extends FlowEntity {

private @OneToMany(targetEntity=NewCPEntity.class, fetch=FetchType.EAGER, cascade=CascadeType.ALL,mappedBy="parent") 
        Set<NewCPEntity> cpList = new HashSet<NewCPEntity>();

//Constructor
    public NewMultiCPEntity(){
        setFlowName(EnumFlow.N_CP_M.getFlowAcronym());
    }

...

public @Table(name="ams_newCPEntity") @Entity class NewCPEntity extends FlowEntity {

final static Logger log = LoggerFactory.getLogger(NewCPEntity.class);

private boolean formNCPValidated;

private @ManyToOne @JoinColumn(name="parent_Id", nullable=false)
        NewMultiCPEntity parent;

public NewCPEntity(){
    log.debug("Instanciation of a new CP");
    setFlowName(EnumFlow.N_CP.getFlowAcronym());
}

public @Override OrganisationalEntity getOrganisationalEntity(){
    return parent.getOrganisationalEntity();
}

...

如果我不添加 @JoinColumn 注释,JPA 会创建一个关联表,但无法检索父级,而关联可以通过在数据库中请求直接完成。

非常感谢您的帮助。

问候,

4

1 回答 1

0

谢谢克里斯的评论,你是对的,我忘记更改表的名称。我认为这不是问题,因为继承映射在一个带有 DTYPE 鉴别器列的表中。

最后,我通过在添加这样的新孩子时设置父属性来解决我的问题:

public @Table @Entity class NewMultiCPEntity  extends FlowEntity {

    private @OneToMany(targetEntity=NewCPEntity.class, fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
            List<NewCPEntity> cpList = new ArrayList<>();

    //Constructor
        public NewMultiCPEntity(){
            setOrganisationalEntity(new OrganisationalEntity());
            setFlowName(EnumFlow.N_CP_M.getFlowAcronym());
        }

    public List<NewCPEntity> getNCPList(){
        if(cpList == null){
            cpList = new ArrayList<>();
        }
        if(cpList.isEmpty()){
            addCPEntity(new NewCPEntity());
        }
        return Collections.unmodifiableList(cpList);}

    public boolean removeCPEntity(NewCPEntity entity){
        return cpList.remove(entity);
    }
    public boolean addCPEntity(NewCPEntity entity){
        entity.setParent(this);
        entity.setOrganisationalEntity(this.getOrganisationalEntity());
        return cpList.add(entity);
    }

我删除了子项中 getOrganizationalEntity 的覆盖:

public @Table @Entity class NewCPEntity extends FlowEntity {

    final static Logger log = LoggerFactory.getLogger(NewCPEntity.class);


    private @ManyToOne(targetEntity=NewMultiCPEntity.class,cascade=CascadeType.ALL)
            NewMultiCPEntity parent;

    public NewCPEntity(){
        log.debug("Instanciation of a new CP");
        setFlowName(EnumFlow.N_CP.getFlowAcronym());
    }

    public NewMultiCPEntity getParent() {
        return parent;
    }

    public void setParent(NewMultiCPEntity parent){
        this.parent = parent;
    }

问候,

于 2013-02-28T09:35:57.807 回答