added more generalizations
This commit is contained in:
@ -33,6 +33,9 @@ import javax.persistence.criteria.CriteriaBuilder;
|
|||||||
import javax.persistence.criteria.CriteriaQuery;
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
import javax.persistence.criteria.Order;
|
import javax.persistence.criteria.Order;
|
||||||
import javax.persistence.criteria.Root;
|
import javax.persistence.criteria.Root;
|
||||||
|
import javax.persistence.metamodel.IdentifiableType;
|
||||||
|
import javax.persistence.metamodel.Metamodel;
|
||||||
|
import javax.persistence.metamodel.SingularAttribute;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,7 +62,7 @@ public abstract class AbstractController<T> {
|
|||||||
return em.merge(entity);
|
return em.merge(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TransactionAttribute (TransactionAttributeType.REQUIRED)
|
@TransactionAttribute(TransactionAttributeType.REQUIRED)
|
||||||
@Transactional
|
@Transactional
|
||||||
@Lock(LockType.WRITE)
|
@Lock(LockType.WRITE)
|
||||||
public void create(T entity) {
|
public void create(T entity) {
|
||||||
@ -73,7 +76,7 @@ public abstract class AbstractController<T> {
|
|||||||
em.persist(entity);
|
em.persist(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TransactionAttribute (TransactionAttributeType.REQUIRED)
|
@TransactionAttribute(TransactionAttributeType.REQUIRED)
|
||||||
@Transactional
|
@Transactional
|
||||||
@Lock(LockType.WRITE)
|
@Lock(LockType.WRITE)
|
||||||
public T update(T entity) {
|
public T update(T entity) {
|
||||||
@ -85,7 +88,7 @@ public abstract class AbstractController<T> {
|
|||||||
return em.merge(entity);
|
return em.merge(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TransactionAttribute (TransactionAttributeType.REQUIRED)
|
@TransactionAttribute(TransactionAttributeType.REQUIRED)
|
||||||
@Transactional
|
@Transactional
|
||||||
@Lock(LockType.WRITE)
|
@Lock(LockType.WRITE)
|
||||||
public void delete(T entity) {
|
public void delete(T entity) {
|
||||||
@ -116,4 +119,31 @@ public abstract class AbstractController<T> {
|
|||||||
return query.getResultList();
|
return query.getResultList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returnns null, if the list is empty or null itself. Returns the one
|
||||||
|
* element if there is exactly one element in the list. Otherwise an
|
||||||
|
* exception is thrown
|
||||||
|
*
|
||||||
|
* @param resultList
|
||||||
|
* @return
|
||||||
|
* @throws ControllerException
|
||||||
|
*/
|
||||||
|
public T ensureSingleElement(List<T> resultList) throws ControllerException {
|
||||||
|
if ((resultList == null) || (resultList.isEmpty())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (resultList.size() > 1) {
|
||||||
|
throw new ControllerException(ControllerException.CAUSE_TOO_MANY_ROWS, "More than one element found in list - expected exactly one");
|
||||||
|
}
|
||||||
|
return resultList.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> SingularAttribute<? super T, ?> getIdAttribute() {
|
||||||
|
Metamodel m = em.getEntityManagerFactory().getMetamodel();
|
||||||
|
IdentifiableType<T> of = (IdentifiableType<T>) m.managedType(entityClass);
|
||||||
|
// of.getDeclaredId(entityClass).getJavaMember().
|
||||||
|
return of.getId(of.getIdType().getJavaType());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 joern.muehlencord.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package de.muehlencord.shared.account.business;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author joern.muehlencord
|
||||||
|
*/
|
||||||
|
public class ControllerException extends Exception {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 5190280225284514859L;
|
||||||
|
public static final int CAUSE_ALREADY_EXISTS = 1;
|
||||||
|
public static final int CAUSE_NOT_FOUND = 2;
|
||||||
|
public static final int CAUSE_CANNOT_PERSIST = 3;
|
||||||
|
public static final int CAUSE_TOO_MANY_ROWS = 4;
|
||||||
|
|
||||||
|
private final int causeCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of <code>ControllerException</code> without detail
|
||||||
|
* message.
|
||||||
|
*
|
||||||
|
* @param cause the reason code
|
||||||
|
* @param message an explanation
|
||||||
|
*/
|
||||||
|
public ControllerException(int cause, String message) {
|
||||||
|
super(message);
|
||||||
|
this.causeCode = cause;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param causeCode
|
||||||
|
* @param message
|
||||||
|
* @param cause
|
||||||
|
*/
|
||||||
|
public ControllerException(int causeCode, String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
this.causeCode = causeCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCauseCode() {
|
||||||
|
return causeCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user