package blog.common;
import java.lang.reflect.*;
import javax.annotation.*;
import javax.persistence.*;
import static org.junit.Assert.*;
public abstract class BaseTestData<E extends BaseEntity>
{
private final Class<E> entityClass;
@PersistenceContext private EntityManager em;
private int id;
@SuppressWarnings("unchecked")
protected BaseTestData()
{
entityClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@PostConstruct
private void beginTransaction()
{
EntityTransaction transaction = em.getTransaction();
if (!transaction.isActive()) {
transaction.begin();
}
}
@PreDestroy
private void endTransaction()
{
EntityTransaction transaction = em.getTransaction();
if (transaction.isActive()) {
transaction.rollback();
}
}
protected final int getId() { return id++; }
public final void save(BaseEntity entity)
{
if (entity.getId() == null) {
em.persist(entity);
}
em.flush();
}
public final E find(Long entityId)
{
return em.find(entityClass, entityId);
}
public final void detachFromPersistenceContext(BaseEntity entity)
{
em.detach(entity);
}
public final E assertSavedToDB(E entity)
{
if (em.contains(entity)) {
em.detach(entity);
}
E fromDb = em.find(entityClass, entity.getId());
assertEquals(entity.getId(), fromDb.getId());
assertNotSame(entity, fromDb);
return fromDb;
}
public final void assertDeletedFromDB(BaseEntity entity)
{
BaseEntity deletedEntity = find(entity.getId());
assertNull(deletedEntity);
}
public final E buildAndSave()
{
E entity = build();
save(entity);
return entity;
}
protected abstract E build();
}