Pregunta

Estoy luchando con la ejecución de un caso de prueba bastante simple usando Arquillian: utiliza una clase EJB en orden inserte una entidad (usuario) en la DB usando JPA (Hibernate), pero se lanzó una excepción.Estoy usando Testgn como el marco de prueba.

Estructura de carpeta

MyProject  
   ear
   domain - all jpa entities  
   ejb - holds NewUser ejb  
   war - currently empty

prueba

public class NewUserTest extends Arquillian
{
    @EJB
    private NewUser newUser;

    @Deployment
    public static JavaArchive createDeployment()
    {
        JavaArchive arc = ShrinkWrap
                .create(JavaArchive.class)
                .addClasses(User.class, Gender.class, PersonalData.class,
                        NewUser.class, NewUserTest.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
                .addAsResource("META-INF/test-persistence.xml",
                        "META-INF/persistence.xml");
        return arc;
    }

    @Test
    public void checkDBInsert()
    {
        newUser.registerUser();
    }
}

ejb

@Stateless
public class NewUser
{
    @PersistenceContext(name = "testPU")
    EntityManager em;

    public void registerUser()
    {
        Calendar cal = Calendar.getInstance();
        cal.set(1111, 2, 3);
        User user = new User("Bugs", "Bunny", Gender.MALE, cal.getTime());
        em.persist(user);
    }
}

entidad

@Entity
@TableGenerator(name = "UserIdGenerator", initialValue = 0, allocationSize = 1)
@NamedQueries({
        @NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")})
public class User implements Serializable
{
    private static final long serialVersionUID = -5675781058185805901L;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "UserIdGenerator")
    private Long id;

    @Embedded
    PersonalData personalData;

    public User()
    {
    }

    public User(String name, String familyName, Gender gender, Date birthdate)
    {
        this.init(name, familyName, gender, birthdate);
    }

    public Long getId()
    {
        return this.id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public PersonalData getPersonalData()
    {
        return this.personalData;
    }

    public void setPersonalData(PersonalData personalData)
    {
        this.personalData = personalData;
    }

    private void init(String name, String familyName, Gender gender,
            Date birthdate)
    {
        PersonalData personalDataToAdd = new PersonalData(name, familyName,
                gender, birthdate);
        this.init(personalDataToAdd);
    }

    private void init(PersonalData personalData)
    {
        this.personalData = personalData;
    }

    @Override
    public boolean equals(Object other)
    {
        boolean toReturn = false;

        if (other instanceof User)
        {
            User castOther = (User) other;
            toReturn = this.personalData.equals(castOther.getPersonalData());
        }

        return toReturn;
    }

    @Override
    public String toString()
    {
        return "Id: " + this.id + "\n" + this.personalData;
    }
}

prueba-persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.1"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
                        http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="testPU" transaction-type="JTA">

        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>

        <!-- Entities -->
        <class>business.entities.PersonalData</class>
        <class>business.entities.User</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />

            <!-- general properties -->
            <property name="hibernate.id.new_generator_mappings" value="true" />
        </properties>
    </persistence-unit>
</persistence>

La excepción

FAILED: checkDBInsert
javax.ejb.EJBException: java.lang.IllegalArgumentException: Unknown entity: business.entities.User
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:190)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:340)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
    <<<<<<<<<<<<<<<<rest of stack trace was deleted due to convenience issues>>>>>>>>>>>>>>>>>
Caused by: java.lang.IllegalArgumentException: Unknown entity: business.entities.User
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1184)
    at org.jboss.as.jpa.container.AbstractEntityManager.persist(AbstractEntityManager.java:581)
    at business.boundary.NewUser.registerUser(NewUser.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    <<<<<<<<<<<<<<<<rest of stack trace was deleted due to convenience issues>>>>>>>>>>>>>>>>>

No importa lo que cambie, obtengo otra excepción ...

¿Fue útil?

Solución

Aparentemente, tuve dos pruebas-persistencia.xml: uno en los recursos del dominio (el correcto), y el otro en los recursos de EJB (uno malo).Cuando se mueve la prueba de dominio, la persistencia.xml a los recursos de EJB todo funcionó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top