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
@实体
公共类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。现在,这是最好的办法。。我还想创建一个完全干净的实体,没有任何逻辑。所有逻辑都将放在服务层。好吧,实现它,如果它真的存在