Question

Je suis en difficulté avec une analyse de test assez simple à l'aide d'Arquillian - il utilise une classe EJB dans l'ordre d'insérer une entité (utilisateur) à la DB à l'aide de JPA (hibernate), mais une exception est lancée.J'utilise Testng comme cadre de test.

Structure de dossier

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

test

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);
    }
}

entité

@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;
    }
}

test-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>

l'exception

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>>>>>>>>>>>>>>>>>

Peu importe ce que je change, je reçois une autre exception ...

Était-ce utile?

La solution

Apparemment, j'ai eu deux test-persistance.xml: un dans les ressources de domaine (le bon) et l'autre dans les ressources de l'EJB (une mauvaise).Lorsque vous avez déplacé le test-persistant de domaine .xml aux ressources de l'EJB tout a fonctionné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top