jpa eclipselink 异常 [EclipseLink-4002]

jpa eclipselink Exception [EclipseLink-4002]

这是我遇到的异常:

[EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): 
org.eclipse.persistence.exceptions.DatabaseException Internal Exception: 
java.sql.SQLSyntaxErrorException: Vergleiche zwischen 'BIGINT' und 'VARCHAR (UCS_BASIC)' 
werden nicht unterstützt.

Error Code: 30000
Call: SELECT t1.ID, t1.TEXTINFO FROM COORDINATESLOCATION_INFORMATION t0, TEXTINFORMATION t1 
WHERE ((t0.CoordinatesLocation_ID = ?) AND (t1.ID = t0.informationList_ID))
bind => [1 parameter bound]

当我 运行 我的应用程序首先(没有空数据库)时,一切正常。我可以轻松地管理所有 CRUD 功能中的数据。稍后(在不特定时间或多次请求之后)出现异常。

这是一个旅游信息应用程序。有创建旅游的作者。一次旅行包含许多地点。一个位置包含许多信息。这些关联被实现为组合。

当我将每个关联都更改为急切获取时,异常出现在工作流的较早位置。

以下是代码片段:

    @Entity
    public class CoordinatesLocation implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;
    private String description;
    @OneToMany(fetch = FetchType.EAGER)
    private List<Information> informationList = new ArrayList<>();
    private double lat;
    private double lng;
    }

    @Entity
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public abstract class Information implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    }

    @Entity
    public class TextInformation extends Information {

    private String textInfo;
    }

加 getter & setter!

感谢您的帮助!

我无法阅读您的异常中的本地化消息,但我猜它说您无法比较 bigint 和 varchar。我会进一步猜测错误在 SQL: (t1.ID = t0.informationList_ID) 的这一部分。这些列之一是 bigint 而另一列是 varchar 吗?

基本上在这里 t0.CoordinatesLocation_ID = ?有时候你的参数是BIGINT类型,而请求的类型是VARCHAR,你应该看看这个

使用您提供的代码,我可以在 EclipseLink 中重现问题。生成的脚本是;

CREATE TABLE COORDINATESLOCATION_INFORMATION (CoordinatesLocation_ID BIGINT 
NOT NULL, informationList_ID VARCHAR(255) NOT NULL, PRIMARY KEY 
(CoordinatesLocation_ID, informationList_ID))

我已经尝试显式定义连接的列 table;

@OneToMany(fetch = FetchType.EAGER)
   @JoinTable (name = "COORDINATESLOCATION_INFORMATION",
            joinColumns = @JoinColumn(name = "CoordinatesLocation_ID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "Information_ID",referencedColumnName = "ID" ))
private List<Information> informationList;

……但仍然得到 VARCHAR(255)。

我已经删除了

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

来自 Information class(因此默认为 SINGLE_TABLE 策略),这会导致所需的脚本:

CREATE TABLE COORDINATESLOCATION_INFORMATION (CoordinatesLocation_ID BIGINT NOT 
NULL, informationList_ID BIGINT NOT NULL, PRIMARY KEY (CoordinatesLocation_ID, 
informationList_ID)).

因此,经过一些实证分析(我不确定为什么 ID 被映射到 VARCHAR(255) 类型),您有几个选择。

  1. 修改 CREATE TABLE COORDINATESLOCATION_INFORMATION 脚本以包含 informationList_ID BIGINT。
  2. 更改为@Inheritance(strategy = InheritanceType。SINGLE_TABLE)。这需要增加一个鉴别器列,可能不符合你的做法。

另请注意,对于@OneToMany,如果您在信息中添加外键table并在信息端定义@ManyToOne,在坐标位置定义@OneToMany,则不需要连接table支持 mappedBy 属性。

这篇 link 会给出一些想法。 https://en.wikibooks.org/wiki/Java_Persistence