【问题标题】:eclipselink/jpa inheritance problemseclipselink/jpa 继承问题
【发布时间】:2018-09-15 07:38:41
【问题描述】:

我正在使用带有 eclipse 链接的 spring boot (2.0.0) 将数据(超过 500 个实体类)保存到 postgres db (6.5)。那效果很好。为了通过 REST 接收数据,我构建了另一个 Spring Boot 应用程序。这里我对 JPA 有一些继承问题(抱歉我的绘图):

C类和D类(抽象)继承自B类。A类有一个对B类的引用(attribute1)。这个属性是实体类E的一个实例,它继承自抽象类D。我正在使用继承策略每班表。每个类都使用带有表名的注释实体。在数据库中,A 类的表对 E 类的表具有正确的外键,但如果我想读取数据,则属性 1 为空。我从日志级别看到 eclipse 链接只查看 C 类的表内部。我该如何解决这个问题?

向本杰​​明问好

【问题讨论】:

  • 如果我从 d 类中删除摘要,它会起作用
  • 如果我从类 d 中删除 @entity 注释会得到错误:使用非实体...作为关系属性中的目标实体...因为在另一个类中我有一个参考它
  • 为什么不显示 A 和 B 类/映射?您还首先声明您可以使用 EclipseLink 将这些数据持久保存到数据库中 - 它是如何映射到那里的,如果它有效,为什么不在这里也使用它呢?
  • @Chris 对不起,我可以将这些类保存到数据库中,但我无法通过 eclipselink 检索到这个类。在我的数据模型中:A 类有一个 B 类类型的私有字段(属性 1)。我不想更改数据模型,因为它是一个标准。
  • 您仍然需要为我们显示类和映射,以帮助指出它可能出现的问题。

标签: sql spring-boot jpa inheritance eclipselink


【解决方案1】:

这里是类,E类:

@Entity(name="ep_core_voltagelevel")

public class VoltageLevel extends EquipmentContainer {

@Embedded

@AttributeOverrides(@AttributeOverride(name="value", column=@Column(name="highVoltageLimit_value")
)
)

private myPackage.DomainProfile.Voltage highVoltageLimit;

public myPackage.DomainProfile.Voltage getHighVoltageLimit()  {
return highVoltageLimit;
}

public void setHighVoltageLimit(myPackage.DomainProfile.Voltage parameter)  {
this.highVoltageLimit = parameter;
}

@Embedded

@AttributeOverrides(@AttributeOverride(name="value", column=@Column(name="lowVoltageLimit_value")
)
)

private myPackage.DomainProfile.Voltage lowVoltageLimit;

public myPackage.DomainProfile.Voltage getLowVoltageLimit()  {
return lowVoltageLimit;
}

public void setLowVoltageLimit(myPackage.DomainProfile.Voltage parameter)  {
this.lowVoltageLimit = parameter;
}

@ManyToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})

@JoinColumn(nullable=false, name="basevoltage_id")

private BaseVoltage baseVoltage;

public BaseVoltage getBaseVoltage()  {
return baseVoltage;
}

public void setBaseVoltage(BaseVoltage parameter)  {
this.baseVoltage = parameter;
}

@ManyToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})

@JoinColumn(nullable=false, name="substation_id")

private Substation substation;

public Substation getSubstation()  {
return substation;
}

public void setSubstation(Substation parameter)  {
this.substation = parameter;
}
}

D 类:

@Entity(name = "ep_core_equipmentcontainer")
public abstract class EquipmentContainer extends ConnectivityNodeContainer {
}

B类:

@Entity(name="ep_core_connectivitynodecontainer")
public abstract class ConnectivityNodeContainer extends PowerSystemResource {
}

A类:

public class ConnectivityNode extends IdentifiedObject {

    @ManyToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})

    @JoinColumn(nullable=false, name="connectivitynodecontainer_id")

    private ConnectivityNodeContainer connectivityNodeContainer;

    public ConnectivityNodeContainer getConnectivityNodeContainer()  {
        return connectivityNodeContainer;
    }

    public void setConnectivityNodeContainer(ConnectivityNodeContainer parameter)  {
        this.connectivityNodeContainer = parameter;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多