当前位置: 首页 > 知识库问答 >
问题:

JPA映射,父级到子级和子级到父级,具有两个类和抽象类

江洲
2023-03-14

我有两个从抽象类继承的类,它们有父子关系。

所以我使用了注释OneToOne和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();
}

...

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

非常感谢你的帮助。

祝好

共有1个答案

公西承
2023-03-14

谢谢Chris的评论,你是对的,我忘记更改表的名称了。我认为这不是问题,因为继承映射在一个带有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;
    }

祝好

 类似资料:
  • 假设我有一个应用程序来处理一系列的书。 我的应用程序允许向库中添加新书。创建书籍时,用户可以在列表中选择作者,如果作者尚不存在,则可以将其添加到列表中,并在表单字段中提供其姓名。填写表单后,数据将发送到WS,类似 然后我将json映射到我的实体中 书: 作者 这不会像用户尝试添加新作者一样工作,当我尝试. sav()时,我会收到错误: 组织。冬眠TransientPropertyValueExce

  • 问题是要确定子数据的总和是否等于父数据。如果是,返回真,否则返回假。 下面是我的代码,在提交时出现错误。我知道这是一个简单的问题,但在编写了条件之后,我很难通过遍历所有左右节点来递归检查二叉树中每个节点的和条件。 请指导我,因为我哪里做错了。

  • 问题内容: 假设我们有3个Entities对象类: 如何使用JPA2.x(或hibernate)批注来: 父级删除时(一对多)自动删除所有子级 删除后自动从子级列表中删除子级(多对一) 儿童删除时(一对一)自动删除玩具 我正在使用Hibernate 4.3.5和mysql 5.1.30。 谢谢 问题答案: 如本文所述, 实体状态转换应从父级到子级联,而不是相反。 您需要这样的东西:

  • 问题内容: 我用这个文章为例(做出反应的方式),但它不是为我工作。请指出我的错误,因为我不明白怎么了。 这是我看到的错误: 未捕获的TypeError:this.props.onClick不是函数 这是我的代码: 提前致谢! 问题答案: 问题在于回调内部不引用React组件,因此是。 您可以通过将第二个参数传递给来显式设置值: 现在,回调 内部 的值与回调 外部 (即实例)的值相同。 这与Reac

  • 我有两个实体使用Spring和Hibernate

  • 在我的jpa映射中,我试图将带有一个主键的父类映射到带有复合键的子类,但似乎插入了错误的表,它已经生成了2个表,但不幸的是我没有绑定外键(policy_value_summary_id) 我试图用策略值(子类)保存策略摘要值(父),如下所示 下面是输出给我的错误