gpt4 book ai didi

java - 模型类本身用作字段类型会导致 Ebean 中出现错误

转载 作者:行者123 更新时间:2023-11-30 03:08:10 24 4
gpt4 key购买 nike

我使用的是 Play Framework 2.4。我想用这个继承链来建模一组类:

Research <- Publication <- Article

问题是,我希望 Publication 类引用该类的其他对象,如下所示:

@MappedSuperclass
public abstract class Research extends Model {
@Id
public Long id;
}

@Entity
public class Publication extends Model {
@ManyToOne
public Publication translationOf;
}

当我不从发布继承时,这有效。当我添加从文章继承时:

@MappedSuperclass
public abstract class Publication extends Model {
@ManyToOne
public Publication translationOf;
}

@Entity
public class Article extends Publication { }

我得到:

java.lang.RuntimeException: Error with association
to [class models.research.Publication]
from [models.research.publication.Article.translationOf].
Is class models.research.Publication registered?

我认为也许显式配置 InheritanceType 会有所帮助,但是添加 @Inheritance 标记会导致 NullPointerException ,而不会在堆栈跟踪。例如,在这种情况下就会发生这种情况:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype", discriminatorType = DiscriminatorType.STRING)
public abstract class Research extends Model {
@Id
public Long id;
public String dtype;
}

@Entity
@DiscriminatorValue("P")
public class Publication extends Model {
@ManyToOne
public Publication translationOf;
}

最佳答案

在第一个示例中,Publication 是一个 @Entity。之后它突然变成了一个@Mappedsuperclass

我不明白你想要什么。您希望将一份出版物链接到其他出版物吗?因为这是一个多对多关系。

对于多对多关系,您需要指定“mappedBy”参数。

文章和出版物也是如此。一篇文章可以出现在许多出版物中,并且许多出版物可以包含同一篇文章。

除非它必须针对您的设置特别不同?

编辑:稍微尝试一下,此设置有效:

@MappedSuperclass
public abstract class Research extends Model {

@Id
public Long id;
}


@Entity
public class Publication extends Research {

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "myReferences")
// What other publications refer to this one?
public List<Publication> referencedBy;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "CROSS_REFERENCE",
joinColumns = {
@JoinColumn(name = "MY_ID")
},
inverseJoinColumns = {
@JoinColumn(name = "REFERENCER_ID")
})
// What publications am I referring to?
public List<Publication> myReferences;

// The list of articles in this publication.
@ManyToMany(cascade = CascadeType.ALL)
public List<Article> articles;
}


@Entity
public class Article extends Research {

// The publications this article appears in.
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "articles")
public List<Publication> publications;
}

多对多关系总是需要有一个“所有者”。

在出版物到出版物的情况下,它是 myReferences 字段。这就是为什么“referencedBy”字段在 @ManyToMany 注释中具有“mappedBy”参数。

出版物无法提前知道 future 的出版物将引用它们,并且过去的出版物不会更改以引用这个新出版物。

因此,您只能说新出版物引用了哪些旧出版物。

以及它包含哪些文章。

您可以在两个方向上添加,但通常最好的做法是使用一个方向并坚持下去。

希望有帮助。

关于java - 模型类本身用作字段类型会导致 Ebean 中出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227657/

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