GAE / J - ошибка JPA - тип ("") не относится к объекту, но должен быть для этой операции - PullRequest
4 голосов
/ 09 ноября 2011

Я немного расстроен с JPA, но я немного искал и не смог найти этот код ошибки, поэтому я опубликую его здесь.

Я пытаюсь сохранить этот класс:

@Entity(name = "UserBasket")
public class UserBasket extends BaseBasket implements Serializable  {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    private static final long serialVersionUID = 1L;

    public static long getSerialversionuid() {
        return serialVersionUID;
    }

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }


}

С помощью этого вызова метода:

public Long createUserBasket(UserBasket basket) {
try{
        synchronized (this) {
            EntityManager em = EMFService.get().createEntityManager();
            em.persist(basket);
            em.close();
        }
    }catch(Exception ex){

        //log.severe("Uh oh!" + ex.toString());
    }
}

И получаю эту ошибку:

java.lang.IllegalArgumentException: Type ("") is not that of an entity but needs to be for this operation

Я запускаю это на GAE.Я подозреваю, что это как-то связано с моей сущностью, но я не уверен, что.

Редактировать: Заполнение более подробной информации -

Вот BaseBasket (я вырезал геттеры и сеттеры)

@Entity(name = "BaseBasket")
public class BaseBasket {

    public String basketID;
        public List<BasketItem> items;

}

И я создаю UserBasket с простым:

UserBaset b = new UserBasket();

, а затем присваиваю различные значения.

Я не использовал усилитель datanucleus как, и этоэто только мое наивное понимание, что это не требуется, и, поскольку эти объекты (UserBasket и т. д.) совместно используются клиентской и серверной частью моего приложения, я хотел, чтобы они были простыми.

Ответы [ 2 ]

5 голосов
/ 20 апреля 2012

Поскольку вы используете JPA, убедитесь, что ваше определение persistence.xml соответствует документации DataNucleus

В частности, если вы не используете файл сопоставления, убедитесь, что все ваши сущности, которые вы хотите сохранить, объявлены в элементах классов. Как приведенный пример:

<!-- Online Store -->
<persistence-unit name="OnlineStore">
    <provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
    <class>org.datanucleus.samples.metadata.store.Product</class>
    <class>org.datanucleus.samples.metadata.store.Book</class>
    <class>org.datanucleus.samples.metadata.store.CompactDisc</class>
    <class>org.datanucleus.samples.metadata.store.Customer</class>
    <class>org.datanucleus.samples.metadata.store.Supplier</class>
    <exclude-unlisted-classes/>
    <properties>
        <property name="datanucleus.ConnectionDriverName" value="org.h2.Driver"/>
        <property name="datanucleus.ConnectionURL" value="jdbc:h2:datanucleus"/>
        <property name="datanucleus.ConnectionUserName" value="sa"/>
        <property name="datanucleus.ConnectionPassword" value=""/>
    </properties>
</persistence-unit>
0 голосов
/ 28 июня 2018

В DataNucleus эта ошибка также может быть вызвана воздействием на объект, который null, например ::

MyEntity entity = txn.em().find(MyEntity.class, entityId); // no such record, returns 'null'
txn.em().lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT); // IllegalArgumentException: Type ("") ...
...