我正在尝试使用带有MySQL ndbcluster表的实体。此表类型不允许使用外键,但到目前为止,我的实体并没有出现问题。
但是,当我尝试使用EntityManager的createNativeQuery方法加载实体时,我遇到了一些问题。由于我无法执行此操作,我需要使用此方法:How to make a CriteriaBuilder join with a custom "on" condition?
我的MySQL表格如下:
CREATE TABLE `category` (
`id` SMALLINT(6) NOT NULL AUTO_INCREMENT,
`category_id` SMALLINT(6) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `category_id` (`category_id`)
)
COLLATE='utf8_general_ci'
ENGINE=ndbcluster
ROW_FORMAT=DEFAULT
如果我将表引擎更改为innodb,并添加外键,则createNativeQuery方法可以正常工作。
我的实体类看起来像这样:
@Entity
@Table(name = "category")
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Short id;
@OneToMany(mappedBy = "categoryId")
private List<Category> categoryList;
@JoinColumn(name = "category_id", referencedColumnName = "id")
@ManyToOne
private Category categoryId;
public Category() {
}
// getters and setters
}
即使没有外键,当我使用CriteriaBuilder进行查询时,这个实体也能正常工作,但遗憾的是,CriteriaBuilder并不是一切都可以。
我在使用createNativeQuery创建的Query对象上调用getResultList时出错。我不知道这是不是一个bug,或者是否应该将某些东西添加到我的实体类中以使其工作。
错误说:
Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException
Exception Description: The primary key read from the row [ArrayRecord(
=> 2519
=> 2463
=> Tools)] during the execution of the query was detected to be null. Primary keys must not contain null.
Query: ReadAllQuery(referenceClass=Category sql="select * from `category`")
at org.eclipse.persistence.exceptions.QueryException.nullPrimaryKeyInBuildingObject(QueryException.java:895)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:584)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:560)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:717)
at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:769)
...
我的表包含1行,其中id = 1且category_id = null,因此没有主键具有空值,尽管错误说明了。如果我删除该行或设置category_id = 1,我不会收到错误。
请帮助。
答案 0 :(得分:1)
通过从EclipseLink(JPA 2.0)切换到OpenJPA(JPA 2.0)来管理它。似乎EclipseLink 2.3.2和/或GlassFish 3.1.2.2中存在某个错误。
我在我的另一个项目中使用了EclipseLink(JPA 2.0),使用了稍微不同的版本Netbeans + GlassFish 3.1.1,我在一个实体类中使用了createNativeQuery作为非关系myisam表。这从来没有造成任何问题。它确实是一个错误。
但问题解决了。再见,再见EclipseLink,你好OpenJPA。
答案 1 :(得分:0)
问题是区分大小写。在MySQL中,您的列“id”将在数据库中定义为“ID”,除非您引用它。如果将映射切换为大写,则应解决问题(即“ID”)。
您也可以引用列名称(“'id'”)
或设置持久性单元属性
“eclipselink.jpa.uppercase-列名”= “真”