2013-04-13 39 views
0

我正在嘗試使用MySQL ndbcluster表的實體。這種表類型不允許外鍵,但直到現在它還沒有成爲我的實體的問題。當使用createNativeQuery時,爲什麼我的EJB Entity不能與非關係表一起工作?

但是,當我嘗試使用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時出現錯誤。我不知道這是否是一個錯誤,或者是否應該在我的實體類中添加某些內容以使其工作。

錯誤說:

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

似乎我在我的一個測試中犯了一個錯誤。使用關係表或不使用沒有區別。設置了外鍵的ndbcluster和innodb都會拋出相同的異常。因此,這個問題似乎是使用createNativeQuery方法的問題。 –

回答

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,其中我在一個非關係型myisam表的實體類上使用了createNativeQuery。這從來沒有造成任何問題。它確實必須是一個錯誤。

但問題解決了。再見,再見EclipseLink,你好OpenJPA。

0

問題是區分大小寫。在MySQL中,除非您引用它,否則列中的「id」將在數據庫中定義爲「ID」。如果您將映射切換爲大寫,則應解決問題(即「ID」)。

你也可以引用列名( 「 'ID'」)

或設置持久性單元屬性,

「eclipselink.jpa.uppercase - 列名」= 「真」

+0

你是說如果我在我的實體中使用了'@Column(name =「ID」)'',它會起作用嗎? –

相關問題