我正在尝试将我的 Thorntail 应用程序从 java 8 迁移到 java 11,但我在实体关系方面遇到问题。使用的映射在 java 8 中工作正常,但在 java 11 中我有这个错误:
2019-07-03 15:48:12,713 ERROR [stderr] (main) Exception Description:
Predeployment of PersistenceUnit [p-unit] failed.
2019-07-03 15:48:12,713 ERROR [stderr] (main) Internal Exception:
Exception [EclipseLink-7250] (Eclipse Persistence Services -
2.7.3.v20180807-4be1041):
org.eclipse.persistence.exceptions.ValidationException
2019-07-03 15:48:12,713 ERROR [stderr] (main) Exception Description:
[class com.mytest.data.specific.entities.Table3] uses a non-entity
[class com.mytest.data.specific.entities.Table2] as target entity
in the relationship attribute [field table2].
我的实体映射是这样的:
@MappedSuperclass
public abstract class AbstractIdEntity extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
public Long getId() {
return id;
}
protected void setId(final Long id) {
this.id = id;
}
}
@Entity
@Table(name = "table_2")
public class Table2 extends AbstractIdEntity {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "table_1_id", referencedColumnName = "id")
private Table1 table1;
@Column(name = "some_info", nullable = false)
private String someInfo;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "table_2_id")
private List<Table3> table3List;
//more stuff
}
@Entity
@Table(name = "table_3")
public class Table3 extends AbstractIdEntity {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "table_2_id", referencedColumnName = "id")
private Table2 table2;
@Lob
@Column(name = "some_bytes", nullable = false)
private byte[] someBytes;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "table_3_id")
private List<Table4> table4List;
//more stuff
}
我尝试删除对父级的子级引用,但
EntityManager
找不到任何定义的NamedQuery
。我尝试的另一件事是切换到休眠状态,这个映射可以工作,但在持久化实体时遇到了一些问题。
我正在使用 Thorntail v2.4.0.Final 和 Eclipselink v2.7.3。
有人知道可能是什么问题吗?
我在一个小项目中创建了一个类似的层次结构,并将其上传到 github,如果有人想仔细查看 -> githubProject。
这是一个奇怪的例外。我不知道它是否会修复它,但是您的
@OneToMany
映射应该使用 mappedBy
属性,而不是指定 @JoinColumn
。例如 Table3.table2
应该这样映射:
@OneToMany(mappedBy="table2", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Table3> table3List;
当我将工作代码从 Java 8 迁移到 17(以及 11)时,我遇到了类似的错误。我正在使用 EclipseLink (2.5)。
解决方法是将 EclipseLink 升级到 2.7.13,然后它又可以工作了。