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) 类型),您有几个选择。
- 修改 CREATE TABLE COORDINATESLOCATION_INFORMATION 脚本以包含 informationList_ID BIGINT。
- 更改为@Inheritance(strategy = InheritanceType。SINGLE_TABLE)。这需要增加一个鉴别器列,可能不符合你的做法。
另请注意,对于@OneToMany,如果您在信息中添加外键table并在信息端定义@ManyToOne,在坐标位置定义@OneToMany,则不需要连接table支持 mappedBy
属性。
这篇 link 会给出一些想法。 https://en.wikibooks.org/wiki/Java_Persistence
这是我遇到的异常:
[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) 类型),您有几个选择。
- 修改 CREATE TABLE COORDINATESLOCATION_INFORMATION 脚本以包含 informationList_ID BIGINT。
- 更改为@Inheritance(strategy = InheritanceType。SINGLE_TABLE)。这需要增加一个鉴别器列,可能不符合你的做法。
另请注意,对于@OneToMany,如果您在信息中添加外键table并在信息端定义@ManyToOne,在坐标位置定义@OneToMany,则不需要连接table支持 mappedBy
属性。
这篇 link 会给出一些想法。 https://en.wikibooks.org/wiki/Java_Persistence