JPA班带野外孩子的人

JPA班带野外孩子的人,jpa,jpa-2.0,Jpa,Jpa 2.0,我有一个具有以下字段的数据库实体人员: 身份证 父亲 母亲 我需要创建带有字段子级的JPA实体类。 大概是这样的: @实体 公共类Person实现可序列化{ 私有静态最终长serialVersionUID=1L; @身份证 @GeneratedValue(策略=GenerationType.AUTO) 私有int-id; @列(name=“father”) 私有整数父ID; @列(name=“mother”) 私有整数motherID; @OneToMany(mappedBy=“fatherId

我有一个具有以下字段的数据库实体人员:

  • 身份证
  • 父亲
  • 母亲
  • 我需要创建带有字段子级的JPA实体类。 大概是这样的:

    @实体
    公共类Person实现可序列化{
    私有静态最终长serialVersionUID=1L;
    @身份证
    @GeneratedValue(策略=GenerationType.AUTO)
    私有int-id;
    @列(name=“father”)
    私有整数父ID;
    @列(name=“mother”)
    私有整数motherID;
    @OneToMany(mappedBy=“fatherId”)
    私人名单儿童;
    }
    
    但问题是,我还需要在
    mappedBy
    属性中确定母亲。结果可能如下所示:

    从父亲=id或母亲=id的人中选择*
    
    有人能帮我解决这个问题吗?使用JPA可以完成此任务吗?

    尝试使用EJBQL(或者现在是JPQL)来解决此问题:

      SELECT p FROM Person p WHERE p.father = ?1 OR p.mother = ?2
    

    另外,我会考虑使用一个不是整数的ID来做它。从长远来看,它确实可以咬你(可能是长的或BigInteger)。< /P> < P>试着使用EJBQL(或者在这一点上是JPQL)来解决它:< /P>

      SELECT p FROM Person p WHERE p.father = ?1 OR p.mother = ?2
    

    另外,我会考虑使用一个不是整数的ID来做它。从长远来看,它确实可以咬你(可能是长的或BigInteger)。

    < P>你不能对非对象类型“MaPdBube”(因为这不是一个强的双向的/强的关系)。必须有Person(非整数)类型的“母亲”和“父亲”字段才能具有bidir关系。因此,获取父对象和母对象是很简单的

    您不能将“mappedBy”转换为非对象类型(因为这不是双向关系)。必须有Person(非整数)类型的“母亲”和“父亲”字段才能具有bidir关系。得到父亲和母亲是一件微不足道的事情,除了已经指出的映射问题之外

    不是JPA专家,但我认为JPA没有直接考虑过这个案例。我将使用两个映射和一个辅助伪getter来解决这个问题。样本如下:

    @OneToMany(mappedBy = "father")
    private List<Person> childrenIfFather();
    
    @OneToMany(mappedBy = "mother")
    private List<Person> childrenIfMother();
    
    public getChildren() {
        if (childrenIfFather != null) return childrenIfFather();
        else return childrenIfMother();
    }
    
    @OneToMany(mappedBy=“父亲”)
    private List childrenIfFather();
    @OneToMany(mappedBy=“母亲”)
    私有列表childrenIfMother();
    公众儿童(){
    if(childrenIfFather!=null)返回childrenIfFather();
    否则返回childrenIfMother();
    }
    
    除了已经指出的映射问题之外

    不是JPA专家,但我认为JPA没有直接考虑过这个案例。我将使用两个映射和一个辅助伪getter来解决这个问题。样本如下:

    @OneToMany(mappedBy = "father")
    private List<Person> childrenIfFather();
    
    @OneToMany(mappedBy = "mother")
    private List<Person> childrenIfMother();
    
    public getChildren() {
        if (childrenIfFather != null) return childrenIfFather();
        else return childrenIfMother();
    }
    
    @OneToMany(mappedBy=“父亲”)
    private List childrenIfFather();
    @OneToMany(mappedBy=“母亲”)
    私有列表childrenIfMother();
    公众儿童(){
    if(childrenIfFather!=null)返回childrenIfFather();
    否则返回childrenIfMother();
    }
    
    是的,你说得对,我不能使用mappedBy,因为它不是双向关系。。。是的,我有父亲和母亲作为Person类型,但我的问题是children字段(因此我从示例中删除了这段代码)。Person somePerson=personService.getPerson(1);List children=somePerson.getChildren();Hibernate实现JPA。谁说Hibernate没有实现JPA?JPA有许多实现(DataNucleus JPA也是其中之一)。我的回答是关于OP的问题。是的,你是对的,我不能用mappedBy,因为它不是双向关系。。。是的,我有父亲和母亲作为Person类型,但我的问题是children字段(因此我从示例中删除了这段代码)。Person somePerson=personService.getPerson(1);List children=somePerson.getChildren();Hibernate实现JPA。谁说Hibernate没有实现JPA?JPA有许多实现(DataNucleus JPA也是其中之一)。我的答案是关于OP的问题。是的,JPQL是一个变体。你的意思是像getChildren(长personId)一样在DAO中创建一个方法吗;作为这个方法的主体,比如entityManager.createNativeQuery(“从Person p中选择p,其中p.father=?1或p.mother=?2”,Person.class)?@George您不需要执行本机查询,JPQL可以处理这样的查询,返回所有匹配的“Person”对象。我想你是想让事情变得更复杂。我肯定会使用DAO/服务,并放弃使用包含它的实体。当关系如此简单的时候,维护起来就像一团糟。是的,JPQL是一种变体。你的意思是像getChildren(长personId)一样在DAO中创建一个方法吗;作为这个方法的主体,比如entityManager.createNativeQuery(“从Person p中选择p,其中p.father=?1或p.mother=?2”,Person.class)?@George您不需要执行本机查询,JPQL可以处理这样的查询,返回所有匹配的“Person”对象。我想你是想让事情变得更复杂。我肯定会使用DAO/服务,并放弃使用包含它的实体。当这段关系如此简单的时候,维持起来感觉就像一团糟。对不起,我不能投票赞成,因为我收到了“投票赞成需要15个声誉”的信息:-)你的解决方案已经发生了。虽然它可能会影响性能问题。但是我+1。现在,这是最好的办法。。我还想创建一个完全干净的实体,没有任何逻辑。所有的逻辑都将放在服务层。好吧,实现它,如果它真的适合你,我认为你以后仍然可以将答案标记为正确。在这种情况下,选择列表或其他列表的逻辑与类的持久化方式有关,因此我个人将其放在
    Person
    实体中,而不是放在服务层中。很抱歉,我无法投票,因为我收到消息“投票需要15个信誉”:-)您的解决方案已经完成。虽然它可能会影响性能问题。但是我+1。现在,这是最好的办法。。我还想创建一个完全干净的实体,没有任何逻辑。所有逻辑都将放在服务层。好吧,实现它,如果它真的存在