gpt4 book ai didi

java - JPA 继承映射多个实现

转载 作者:行者123 更新时间:2023-12-01 14:30:08 28 4
gpt4 key购买 nike

我在 JPA 继承方面遇到问题。请参阅下面的我的实体。我有一个Person可以是 HouseCar ,当然永远不会同时。两者CarHouse实现PersonHoldable界面。我知道我无法将实体直接映射到接口(interface)。

这是我的模型:

@Entity
public class Person{
private PersonHoldable personHoldable; // either a Car or a House

// This does not work of course because it's an interface
// This would be the way to link objects without taking JPA into consideration.
@OneToOne
public PersonHoldable getPersonHoldable() {
return this.personHoldable;
}

public void setPersonHoldable(PersonHoldable personHoldable) {
this.personHoldable = personHoldable;
}
}

@Entity
public class Car implements PersonHoldable{}

@Entity
public class House implements PersonHoldable{}

public interface PersonHoldable{}

考虑到以下因素,如何在 JPA 中正确映射它?

  1. 我试过 @MappedSuperclass关于 PersonHoldable 的抽象实现。虽然它适用于这个特定的设置,但问题是 CarHouse实际上实现更多接口(interface)。它们也映射到其他实体。
  2. Person可以为每一种可能拥有一个属性 PersonHoldable ,所以在这种情况下它可能有 getCar()getHouse()属性(property)。这对我来说似乎不太灵活。如果我添加一个 Bike实现PersonHoldable我必须改变我的Person类。
  3. 我可以以相反的方式进行映射,因此仅在 PersonHoldable 上具有 OneToOne 关系实现方。这意味着添加 getPerson()属性(property)PersonHoldable 。但从 Person 来看这并不容易。视角看什么PersonHoldable它已链接到。
  4. 我使用默认的 JPA,因此如果可能的话,不要使用 Hibernate 特定标记。

如果默认 JPA 无法实现这一点,那么在这种情况下最佳实践是什么?

最佳答案

第二点的一个细微变化是使 Person 具有继承类型并实现 CarPerson 和 HousePerson(以及后来的 BikePerson),其全部目的是定义与特定 PersonH​​older 实现的特定连接关系。这可以保持关系完整,并且更容易从 Person 端进行查询。

@Inheritance(strategy = JOINED)
@DiscriminatorColumn(name="holdableType", discriminatorType=CHAR, length=1)
@Entity
public class Person {
// common fields
}

@Entity
@DiscriminatorValue("C")
public class CarPerson extends Person {
@OneToOne
private Car car;
}

@Entity
@DiscriminatorValue("H")
public class HousePerson extends Person {
@OneToOne
private House house;
}

关于java - JPA 继承映射多个实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16913612/

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