我正在嘗試使用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,我不會收到錯誤。
需要幫助。
似乎我在我的一個測試中犯了一個錯誤。使用關係表或不使用沒有區別。設置了外鍵的ndbcluster和innodb都會拋出相同的異常。因此,這個問題似乎是使用createNativeQuery方法的問題。 –