使用createNativeQuery时,为什么我的EJB实体不能使用非关系表?

时间:2013-04-13 18:09:05

标签: jpa jpa-2.0

我正在尝试使用带有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,我不会收到错误。

请帮助。

2 个答案:

答案 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-列名”= “真”