0

MySQL ndbcluster テーブルでエンティティを使用しようとしています。このテーブル タイプでは外部キーを使用できませんが、これまでのところ、私のエンティティでは問題はありませんでした。

ただし、EntityManager の createNativeQuery メソッドを使用してエンティティをロードしようとすると、少し問題が発生しました。これを行うことができないため、このメソッドを使用する必要があります:カスタムの「オン」条件で CriteriaBuilder を結合するにはどうすればよいですか?

私の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)
...

私のテーブルには、id=1 および category_id=null の 1 つの行が含まれているため、エラーの内容にかかわらず、null 値を持つ主キーはありません。その行を削除するか、category_id=1 に設定すると、エラーは発生しません。

助けが必要です。

4

2 に答える 2

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。

于 2013-04-13T21:10:11.053 に答える