JPA 从超类建立 OneToMany 关联

4
我正在尝试映射超类LendingLine和子类Line以及BlockLine之间的继承关系。LendingLine与Lending存在ManyToOne关联。
当我尝试从数据库获取没有继承的LendingLines时,它可以正常工作,关联也可以工作。但是当我添加继承时,Lending中的lendingLines为空。我也无法从具有继承的数据库中获取任何LendingLines。
有人能帮助我吗?
(对于糟糕的解释,我感到抱歉)
提前感谢!
LendingLine:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE")
@DiscriminatorValue(value="Line")
@Table(name = "LendingLine")
public class LendingLine {
...
public LendingLine(){}
@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER, targetEntity=Lending.class)
@JoinColumn(name = "LendingId")
private Lending lending;
...

借贷:

@Entity
@Table(name = "Lending")
public class Lending {
...
public Lending(){}

    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy = "lending")
private List<LendingLine> lendingLines;
...

BlockDate:

@Entity
@DiscriminatorValue(value = "BlockLine")
public class BlockLine extends LendingLine {
public BlockLine(){
}
}

LendingLineRepository:

这个类只从数据库中读取数据,因为数据库是由另一个应用程序(C#)创建的,其中对象被添加到了数据库中。

public class LendingLineRepository extends JpaUtil implement LendingLineRepositoryInterface {
@Override
protected Class getEntity() {
    return LendingLine.class;
}

@Override
public Collection<LendingLine> findAll() {
    Query query = getEm().createQuery("SELECT l FROM LendingLine l");
    System.out.println(query.getResultList().size());
    return (Collection<LendingLine>) query.getResultList();
}

Table LendingLine:

enter image description here


1
为什么在@OneToMany映射中需要@JoinColumn注释?就我所知,您正在LendingLendingLine之间建立双向关系。为什么在@OneToMany映射中需要@JoinColumn注释? - ujulu
@ujulo 我不知道为什么有joinColumn,但我已经将其删除了。虽然还是无法正常工作。感谢您的评论! - Ben Gabriëls
1
Lending 中是否缺少 @Entity 注解? - ujulu
@ujulu 谢谢,我忘记在我的问题中添加它了。 - Ben Gabriëls
1
你能否发布一下你持久化 lendingLines List 的代码? - nik
显示剩余3条评论
1个回答

9

根据您的需求选择超类类型:

具体类

public class SomeClass {}

将您的超类定义为具体类,当您想要查询它并且在进一步逻辑中使用 new 运算符时。您始终可以直接持久化它。在鉴别器列中,此实体具有自己的名称。在查询时,它仅返回自身的实例而没有子类。

抽象类

public abstract class SomeClass {}

将您的超类定义为抽象类,当您想要查询它,但实际上不使用 new 运算符时,因为所有处理的逻辑都由其子类完成。这些类通常由其子类持久化,但仍然可以直接持久化。您可以预定义抽象方法,任何子类都必须实现该方法(几乎像一个接口)。在鉴别器列中,此实体将不会有名称。在查询时,它会返回自身和所有子类,但不包括这些子类的其他定义信息。

MappedSuperclass

@MappedSuperclass public abstract class SomeClass {}

带有接口 @MappedSuperclass 的超类无法查询。它为所有子类提供预定义的逻辑。这就像一个接口。您将无法持久化映射的超类。

更多信息请参见:JavaEE 7 - 实体继承教程


原始信息

您的超类 LendingLine 也需要定义 @DiscriminatorValue,因为它可以被实例化,并且您使用了现有的数据库方案,在其中应该定义此项。


我不认为是这样的。我已经尝试过了,但结果并没有改变。但还是谢谢你的回答! - Ben Gabriëls
是的,没错。我从LendingLine添加了这个表格。(注意:我无法更改数据库因为它是由另一个应用程序创建的)。提前致谢! - Ben Gabriëls
好的,您提供了表格,但是相当不完整。为了澄清实体结构,我们需要更多的信息。从您提供的表格中,超类“LandingLine”似乎是一个抽象类,其子类为“BreakLine”和“Line”。 - XiCoN JFS
谢谢提供的信息,非常有用。我更改了我的类并删除了类行,因为与LendingLine相比没有额外的信息。现在当我尝试从数据库获取LendingLines时,它只给我LendingLines而不是BlockLines。 - Ben Gabriëls
谢谢,伙计。很高兴我能帮到你。 - XiCoN JFS
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接