gpt4 book ai didi

java - JPA 2.0/Hibernate InheritanceType TABLE_PER_CLASS 和 OneToMany/ManyToOne 双向关系

转载 作者:行者123 更新时间:2023-12-04 20:15:45 25 4
gpt4 key购买 nike

我们有 2 个表(一个 Activity 表和一个存档表),它们具有相同的结构(例如 EmployeeEmployeeArchive )。为了能够利用通用代码为两个表使用结果,我们有一个抽象父类,它定义了所有方法和注释。
我们希望能够执行对两个表使用相同查询并将结果合并在一起的查询。

我们有另一个带有 Organization 的实体/表(例如 onetomany)/manytooneEmployee 的双向关系; Organization有一个 ListEmployee s 并且每个员工都有一个组织。
通过关联获取组织的员工时,我们只希望来自 Activity 表的员工而不是存档。

有没有办法实现我们正在尝试或可行的解决方法?

我们尝试了@ MappedSuperclass 的各种实现。 , @Entity/@InheritanceType.TABLE_PER_CLASS努力实现我们想要的。每个实现都几乎可以实现我们想要的,但并不完全。例如,为了能够查询两个表,我们可以有一个抽象父 EntityInheritanceType.TABLE_PER_CLASS但后来我们无法拥有 mappedByEmployee 的关系在 Organization .我们可以使用 MappedSuperclass作为 parent 能够有正确的关系,但我们不能同时查询 ArchiveActive通过联合表。

这基本上是我们要布局的内容:

    @Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractEmployee {
@ManyToOne
@JoinColumn(name="employeeId", nullable=false)
Organization org;
...
}

@Entity
public class Employee extends AbstractEmployee {
}

@Entity
public class EmployeeArchive extends AbstractEmployee {
}

@Entity
public class Organization {
@OneToMany(cascade=ALL, mappedBy="org")
List<Employee> employees;
...
}

代码
    public List<AbstractEmployee> getAllEmployees()
{
Query query = em.createQuery("SELECT e FROM AbstractEmployee e where e.name = ‘John’", AbstractEmployee.class);
return query.getResultList();
}

public List<Organization> getOrganizations()
{
Query query = em.createQuery("SELECT e FROM Organization o ", Organization.class);
List<Organization> orgs = query.getResultList();
// fetch or eager fetch the Employees but only get the ones from the active employee table
return orgs;
}

我们还尝试让父类扩展 MappedSuperclass并将实现和注释放在 MappedSuperclass但我们得到一个 AnnotationException对于 Organization的关系
    @MappedSuperclass
public abstract class AbstractMapped {
@ManyToOne
@JoinColumn(name="employeeId", nullable=false)
Organization org;
}

@Entity
@Inheritance(@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS))
public abstract class AbstractEmployee extends AbstractMapped {
... `Constructors` ...
}

在部署时,我们得到以下异常:
    Caused by org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: Employee.org in Organizaztion.employees
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:685)

最佳答案

您可以通过更改 Organization 的映射来做到这一点。至Employee以便它使用关系表,而不是使用 org Employee 中的字段 table 。参见 Hibernate documentation 中的示例,对你来说看起来像:

@Entity
public class Organization {
@OneToMany(cascade=ALL)
@JoinTable(
name="ACTIVE_EMPLOYEES",
joinColumns = @JoinColumn( name="ORGANIZATION_ID"),
inverseJoinColumns = @JoinColumn( name="EMPLOYEE_ID")
)
List<Employee> employees;
...
}

然而 ,我不得不说,我认为有两个表来代表当前员工和存档员工是一个坏主意。在我看来,这听起来像是一种“软删除”的情况,最好使用表内标志(IS_ACTIVE 或其他东西)来处理。然后你没有这些奇怪的抽象类来做你的查询,多个表具有相同类型的数据等等。这个策略的一点描述 is here .

然后你可以使用你已经得到的非连接表映射,并使用 @Where注释以将组织中的员工限制为将 IS_ACTIVE 设置为 true 的员工。这种方法的一个例子 is here.

关于java - JPA 2.0/Hibernate InheritanceType TABLE_PER_CLASS 和 OneToMany/ManyToOne 双向关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17222565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com