Ошибка гибернации в GWT - PullRequest
       17

Ошибка гибернации в GWT

0 голосов
/ 03 декабря 2010

Я получаю ошибку гибернации.Я просто делаю проверку концепции, чтобы проверить связь в спящем режиме.Я почти уверен, что ошибка, по-моему, заключается в файле сопоставления, но я не могу понять его

Пример, который я использую, заключается в том, что ПОЛЬЗОВАТЕЛЬ может иметь много ЭВМ, но КОМПЬЮТЕР предназначен только для одного ПОЛЬЗОВАТЕЛЯ

my ModuleLoad немного похож на main в Java

public void onModuleLoad() 
    {
        GreetingServiceAsync S = GWT.create(GreetingService.class);
        ((ServiceDefTarget) S).setServiceEntryPoint( GWT.getModuleBaseURL() +"greet");

        Computer C1= new Computer(1,"ad");
        Computer C2= new Computer(2,"ad");
        Computer C3= new Computer(3,"ad");
        Set <Computer> S1= new HashSet();
        S1.add(C2);S1.add(C3);S1.add(C1);

        Users U1= new Users(1,S1);
        S.greetServer(U1, new AsyncCallback <Users>(){

            @Override
            public void onFailure(Throwable caught) {
                // TODO Auto-generated method stub
                Window.alert("Failure");

            }

            @Override
            public void onSuccess(Users result) {
                // TODO Auto-generated method stub
                Window.alert("Success");
            }});

    }

Класс Users:

    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;

    import net.sf.gilead.pojo.gwt.LightEntity;

    import com.google.gwt.user.client.rpc.IsSerializable;

    public class Users extends LightEntity implements IsSerializable
    {
        private long UserId;
        private Set <Computer> Computers=new HashSet <Computer> ();

        public Users(){}
        public Users(long userId, Set <Computer> computers) 
        {
            UserId = userId;
            Computers = computers;
        }
        public long getUserId() {
            return UserId;
        }
        public void setUserId(long userId) {
            UserId = userId;
        }
        public Set <Computer> getComputers() {
            return Computers;
        }
        public void setComputers(Set<Computer> computers) {
            Computers = computers;
        }
    }

Computer Class:

    import net.sf.gilead.pojo.gwt.LightEntity;

    import com.google.gwt.user.client.rpc.IsSerializable;

    public class Computer extends LightEntity implements IsSerializable
    {
        private long ComputerId;
        private String Description;

        public Computer(){}
        public Computer(long ComputerId,String Description)
        {
            this.ComputerId=ComputerId;
            this.Description=Description;
        }

        public long getComputerId() {
            return ComputerId;
        }
        public void setComputerId(long computerId) {
            ComputerId = computerId;
        }
        public String getDescription() {
            return Description;
        }
        public void setDescription(String description) {
            Description = description;
        }
    }

Users Mapping File:
  <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <!-- Generated Dec 3, 2010 5:21:42 AM by Hibernate Tools 3.4.0.Beta1 -->
        <hibernate-mapping>
            <class name="com.BiddingSystem.domain.Users" table="USERS">
                <id name="UserId" type="long">
                    <column name="USERID" />
                    <generator class="assigned" />
                </id>
                <set name="Computers" table="COMPUTER" inverse="false" lazy="true">
                    <key>
                        <column name="USERID" />
                    </key>
                    <one-to-many class="com.BiddingSystem.domain.Computer" />
                </set>
            </class>
        </hibernate-mapping>

Класс компьютера:

import net.sf.gilead.pojo.gwt.LightEntity;

import com.google.gwt.user.client.rpc.IsSerializable;

public class Computer extends LightEntity implements IsSerializable
{
    private long ComputerId;
    private String Description;

    public Computer(){}
    public Computer(long ComputerId,String Description)
    {
        this.ComputerId=ComputerId;
        this.Description=Description;
    }

    public long getComputerId() {
        return ComputerId;
    }
    public void setComputerId(long computerId) {
        ComputerId = computerId;
    }
    public String getDescription() {
        return Description;
    }
    public void setDescription(String description) {
        Description = description;
    }
}

Файл сопоставления компьютеров:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 3, 2010 5:21:42 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
    <class name="com.BiddingSystem.domain.Computer" table="COMPUTER">
        <id name="ComputerId" type="long">
            <column name="COMPUTERID" />
            <generator class="assigned" />
        </id>
        <property name="Description" type="java.lang.String">
            <column name="DESCRIPTION" />
        </property>
    </class>
</hibernate-mapping>

Файл конфигурации Hibernate:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost/postgres</property>
        <property name="hibernate.connection.username">postgres</property>
        <property name="hibernate.connection.password">noor</property>
        <property name="hibernate.connection.pool_size">10</property>
        <property name="show_sql">true</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="current_session_context_class">thread</property> 
        <mapping resource="com/BiddingSystem/domain/Users.hbm.xml"/>
        <mapping resource="com/BiddingSystem/domain/Computer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Реализация сервера для сохранения в базе данных:

import java.util.ArrayList;
import java.util.List;

import net.sf.gilead.core.PersistentBeanManager;
import net.sf.gilead.core.hibernate.HibernateUtil;
import net.sf.gilead.core.store.stateless.StatelessProxyStore;
import net.sf.gilead.gwt.PersistentRemoteService;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.BiddingSystem.client.GreetingService;

import com.BiddingSystem.domain.Users;


import com.google.gwt.user.server.rpc.RemoteServiceServlet;
public class GreetingServiceImpl extends PersistentRemoteService implements GreetingService 
{

    private static final long serialVersionUID = 1L;
    private HibernateUtil gileadHibernateUtil = new HibernateUtil();
    public GreetingServiceImpl ()
    {
         gileadHibernateUtil.setSessionFactory(com.BiddingSystem.server.HibernateUtil.getSessionFactory());

                PersistentBeanManager persistentBeanManager = new PersistentBeanManager();
                persistentBeanManager.setPersistenceUtil(gileadHibernateUtil);
                persistentBeanManager.setProxyStore(new StatelessProxyStore());

                setBeanManager(persistentBeanManager);
    }

    public Users greetServer(Users S) 
    {
        Session session = gileadHibernateUtil.getSessionFactory().openSession();
        Transaction tr= session.beginTransaction();
        session.save(S);
        tr.commit();
        session.close();
         return S;
      }


}

Получаемая ошибка:

Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:183)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
    at com.BiddingSystem.server.GreetingServiceImpl.greetServer(GreetingServiceImpl.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at net.sf.gilead.gwt.PersistentRemoteService.processCall(PersistentRemoteService.java:174)
    ... 21 more

Файл сопоставления пользователей:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 3, 2010 5:21:42 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
    <class name="com.BiddingSystem.domain.Users" table="USERS">
        <id name="UserId" type="long">
            <column name="USERID" />
            <generator class="assigned" />
        </id>
        <set name="Computers" table="COMPUTER" inverse="false" lazy="true">
            <key>
                <column name="USERID" />
            </key>
            <one-to-many class="com.BiddingSystem.domain.Computer" />
        </set>
    </class>
</hibernate-mapping>

Другой файл наверняка будет хорошим, так как я проверил его без спящего режима

Если кто-то может помочь, было бы здорово

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

С назначенным генератором в hibernate вам нужно выбрать другое несохраненное значение, чтобы сообщить hibernate, чтобы определить, нужно ли INSERT или UPDATE.Реализация по умолчанию проверяет, является ли столбец id пустым.Поскольку вы назначаете вручную, даже несохраненные сущности будут иметь идентификатор, и Hibernate попытается выполнить ОБНОВЛЕНИЕ вместо ВСТАВКИ.

Считать раздел идентификатора (в частности, 5.1.2.2.5) документация Hibernate

0 голосов
/ 03 декабря 2010

Убедитесь, что у вас нет триггеров для таблицы, которые связываются со вставкой / обновлением. Иногда случается, что триггер переопределяет результат вставки, что обманывает спящий режим, заставляя думать, что вставка не удалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...