Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java } } 返回queryString.toString(); } 受保护的void startDataAccess()引发DataAccessException{ this.em=ContextEMF.createEntityManager(); 如果(this.em==null)抛出新的DataAccessException(“未创建实体管理器!检查ContextEMF是否正常工作”); this.em.getTransaction().begin(); } 受保护的void closeDataAccess()引发DataAccessException{ if(this.em!=null){ 试一试{ if(this.em.isOpen()){ this.em.getTransaction().commit(); 这个。em。clear(); 这个.em.close(); } }捕获(例外e){ 抛出新的DataAccessException(“执行最终提交时发生数据访问错误。”,e); } em=null; } }_Java_Hibernate_Jpa_Persistence_Rollback - Fatal编程技术网

Java } } 返回queryString.toString(); } 受保护的void startDataAccess()引发DataAccessException{ this.em=ContextEMF.createEntityManager(); 如果(this.em==null)抛出新的DataAccessException(“未创建实体管理器!检查ContextEMF是否正常工作”); this.em.getTransaction().begin(); } 受保护的void closeDataAccess()引发DataAccessException{ if(this.em!=null){ 试一试{ if(this.em.isOpen()){ this.em.getTransaction().commit(); 这个。em。clear(); 这个.em.close(); } }捕获(例外e){ 抛出新的DataAccessException(“执行最终提交时发生数据访问错误。”,e); } em=null; } }

Java } } 返回queryString.toString(); } 受保护的void startDataAccess()引发DataAccessException{ this.em=ContextEMF.createEntityManager(); 如果(this.em==null)抛出新的DataAccessException(“未创建实体管理器!检查ContextEMF是否正常工作”); this.em.getTransaction().begin(); } 受保护的void closeDataAccess()引发DataAccessException{ if(this.em!=null){ 试一试{ if(this.em.isOpen()){ this.em.getTransaction().commit(); 这个。em。clear(); 这个.em.close(); } }捕获(例外e){ 抛出新的DataAccessException(“执行最终提交时发生数据访问错误。”,e); } em=null; } },java,hibernate,jpa,persistence,rollback,Java,Hibernate,Jpa,Persistence,Rollback,} 这是一段代码,其中具有一组外部管理的用户在数据库上进行更新,并引发异常: this.externalManagement1 = new ExternalRoomManagementPermissions(this.room4); this.dbAccessor.saveData(this.externalManagement1); this.externallyManagedRoomsForUser1.add(this.externalManagement1); this.user1.set

}

这是一段代码,其中具有一组外部管理的用户在数据库上进行更新,并引发异常:

this.externalManagement1 = new ExternalRoomManagementPermissions(this.room4);
this.dbAccessor.saveData(this.externalManagement1);
this.externallyManagedRoomsForUser1.add(this.externalManagement1);
this.user1.setRegisteredRooms(this.registeredRoomsForUser1);
this.user2.setRegisteredRooms(this.registeredRoomsForUser2);
userDao.update(this.user1);
userDao.update(this.user2);
this.user1.setExternalManagements(this.externallyManagedRoomsForUser1);

userDao.update(this.user1);  // <---- EXPLODING LINE
this.externalManagement1=新的ExternalRoomManagementPermissions(this.room4);
this.dbAccessor.saveData(this.externalManagement1);
this.externallyManagedRoomsForUser1.add(this.externalManagement1);
this.user1.setRegisterDrooms(this.RegisterDroomsForUser1);
this.user2.setRegisterDrooms(this.RegisterDroomSforUser2);
update(this.user1);
update(this.user2);
this.user1.setExternalManagements(this.externallyManagedRoomsForUser1);
userDao.update(this.user1);// 好的

我想我已经通过密集的调试和大量使用断点发现了这个问题。。。作为一名程序员,我一生中从未在调试方面如此低落过! 导致错误的原因非常愚蠢:

   "org.hibernate.InstantiationException: No default constructor for entity: : it.katuiros.model.entities.ExternalRoomManagementPermissions"
不知何故,异常是在Hibernate层内部启动的,并在同一个地方被吞没,这就是为什么RollbackException本身没有任何原因。我可能会在Hibernate论坛/群组上发布一个bug信号

通过向ExternalRoomManagementPermissions添加默认的空构造函数,我已成功地使代码正常工作:

public ExternalRoomManagementPermissions(){
    super();
}

非常感谢coderanch的Tim Holloway、stackoverflow的Mabi和James Massey的帮助

您在哪里申报此交易?stacktrace基本上是说,您不能提交事务的结果,因为引发了异常或事务被声明为不可提交。为什么要更新两次?只需在user1的末尾添加一个更新调用。我会将Dao代码发布到。您也可以发布服务层代码吗?添加了Ok Dao代码:它是GenericDaoImpl抽象类,由exloding代码中使用的UserDaoImpl类扩展。该更新故意执行了两次,以表明只有在我添加ExternalRoomManagementPermissions集时它才会爆炸。您对服务层是什么意思?您使用的是什么版本的Hibernate?祝贺您解决了这个问题。不知道您的IDE是否支持它,但我很幸运,在您运行关键部分之前应用了“每个异常都中断”(JSF应用程序会抛出合法的异常,所以不要一直启用)。回滚是一个99.9%的符号,表示一个方法没有正常完成并且抛出了一个异常。是的,我正在使用eclipse。无论如何,吞咽异常的原因是糟糕的try/catch异常管理,这在世界范围内的标准化和著名的库(如Hibernate)中是非常糟糕的。同意糟糕的管理部分,但在Hibernate(错误)处理异常之前,打破异常会让您注意到它们。
@Entity
@Table(name = "EXTERNAL_ROOM_MANAGEMENT_PERMISSIONS")
@Access(AccessType.FIELD)
public class ExternalRoomManagementPermissions extends DataModelEntity {

    /**
     * Serialization ID
     */
    private static final long serialVersionUID = 7122195658297760351L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic(optional = false)
    @Column(name = "ID")
    private int id;

    /* CRIMINAL CODE */
    @ManyToOne
    @NotNull
    @JoinColumn(name = "MANAGED_ROOM", referencedColumnName = "ID")
    private Room managedRoom;
    /* END OF CRIMINAL CODE */

    ... constructors and getters/setters ...
}
public abstract class GenericDaoImpl<T> implements GenericDao<T> {

protected EntityManager em;

private Class<T> type;

public GenericDaoImpl() {
    Type t = getClass().getGenericSuperclass();
    ParameterizedType pt = (ParameterizedType) t;
    type = (Class) pt.getActualTypeArguments()[0];
    this.em=null;
}

protected void finalize() throws Throwable{
    this.closeDataAccess();
    super.finalize();
}

/* DATA ACCESS LOGICS */
/* BASIC CRUD OPERATIONS */ 

@Override
public void create(final T t)  throws DataAccessException  {
    try{
        this.startDataAccess();
        this.em.persist(t);
    }catch(Exception e){
        throw new DataAccessException("Data Access error while persisting Object.", e);
    }finally{
        this.closeDataAccess();
    }
}

@Override
public void delete(final Object id)  throws DataAccessException {
    try{
        this.startDataAccess();
        this.em.remove(this.em.getReference(type, id));
    }catch(Exception e){
        throw new DataAccessException("Data Access error while removing Object.", e);
    }finally{
        this.closeDataAccess();
    }
}

@Override
public T find(final Object id)  throws DataAccessException {
    T result = null;
    try{
        this.startDataAccess();
        result = (T) this.em.find(type, id);
    }catch(Exception e){
        throw new DataAccessException("Data Access error while finding Object.", e);
    }finally{
        this.closeDataAccess();
    }
    return result;
}

@Override
public T update(final T t) throws DataAccessException {
    T result = null;
    try{
        this.startDataAccess();
        result = (T) this.em.merge(t);
    }catch(Exception e){
        throw new DataAccessException("Data Access error while updating Object.", e);
    }finally{
        this.closeDataAccess();
    }
    return result;
}

/* MORE OPERATIONS */

/**
 * Method that returns the number of entries from a table that meet some
 * criteria (where clause params)
 *
 * @param params
 *            sql parameters
 * @return the number of records meeting the criteria
 */
@Override
public long countAll(final Map<String, Object> params) throws DataAccessException {
    long result = -1;

    try{
        this.startDataAccess();
        final StringBuffer queryString = new StringBuffer(
                "SELECT count(o) from ");

        queryString.append(type.getSimpleName()).append(" o ");
        queryString.append(this.getQueryClauses(params, null));

        final Query query = this.em.createQuery(queryString.toString());

        result = (Long) query.getSingleResult();
    }catch(Exception e){
        throw new DataAccessException("Data Access error while counting Object.", e);
    }finally{
        this.closeDataAccess();
    }

    return result;
}

/**
 * This method returns the whole list of all T entities available on the datasource.
 * 
 * @return the whole list of all T entities.
 */
@Override
public List<T> list()  throws DataAccessException {
    List<T> resultList = null;

    try{
        this.startDataAccess();
        final StringBuffer queryString = new StringBuffer("SELECT o from ");

        queryString.append(type.getSimpleName()).append(" o ");

        final Query query = this.em.createQuery(queryString.toString());

        resultList =(List<T>) query.getResultList();
    }catch(Exception e){
        throw new DataAccessException("Data Access error while retrieving list of Objects.", e);
    }finally{
        this.closeDataAccess();
    }

    return resultList;
}

/* MISCELLANEOUS UTILITY METHODS */

protected String getQueryClauses(final Map<String, Object> params,
        final Map<String, Object> orderParams) {
    final StringBuffer queryString = new StringBuffer();
    if ((params != null) && !params.isEmpty()) {
        queryString.append(" where ");
        for (final Iterator<Map.Entry<String, Object>> it = params
                .entrySet().iterator(); it.hasNext();) {
            final Map.Entry<String, Object> entry = it.next();
            if (entry.getValue() instanceof Boolean) {
                queryString.append(entry.getKey()).append(" is ")
                        .append(entry.getValue()).append(" ");
            } else {
                if (entry.getValue() instanceof Number) {
                    queryString.append(entry.getKey()).append(" = ")
                            .append(entry.getValue());
                } else {
                    // string equality
                    queryString.append(entry.getKey()).append(" = '")
                            .append(entry.getValue()).append("'");
                }
            }
            if (it.hasNext()) {
                queryString.append(" and ");
            }
        }
    }
    if ((orderParams != null) && !orderParams.isEmpty()) {
        queryString.append(" order by ");
        for (final Iterator<Map.Entry<String, Object>> it = orderParams
                .entrySet().iterator(); it.hasNext();) {
            final Map.Entry<String, Object> entry = it.next();
            queryString.append(entry.getKey()).append(" ");
            if (entry.getValue() != null) {
                queryString.append(entry.getValue());
            }
            if (it.hasNext()) {
                queryString.append(", ");
            }
        }
    }
    return queryString.toString();
}

protected void startDataAccess() throws DataAccessException{
    this.em = ContextEMF.createEntityManager();
    if (this.em==null) throw new DataAccessException("No Entity Manager was created! Check if ContextEMF is correctly working.");
    this.em.getTransaction().begin();
}

protected void closeDataAccess() throws DataAccessException{
    if (this.em!=null){
        try{
            if (this.em.isOpen()){
                this.em.getTransaction().commit();
                this.em.clear();
                this.em.close();
            }
        }catch(Exception e){
            throw new DataAccessException("Data Access error while doing final commit.", e);
        }           
        this.em=null;
    }
}
this.externalManagement1 = new ExternalRoomManagementPermissions(this.room4);
this.dbAccessor.saveData(this.externalManagement1);
this.externallyManagedRoomsForUser1.add(this.externalManagement1);
this.user1.setRegisteredRooms(this.registeredRoomsForUser1);
this.user2.setRegisteredRooms(this.registeredRoomsForUser2);
userDao.update(this.user1);
userDao.update(this.user2);
this.user1.setExternalManagements(this.externallyManagedRoomsForUser1);

userDao.update(this.user1);  // <---- EXPLODING LINE
   "org.hibernate.InstantiationException: No default constructor for entity: : it.katuiros.model.entities.ExternalRoomManagementPermissions"
public ExternalRoomManagementPermissions(){
    super();
}