0

Eclipse4.2でGlassFish3.1.2を使用しています。を使用してJTAトランザクションタイプを指定するとjta-data-source、新しいクラスを追加できます。このクラスは、@Entityアノテーションを付けるとエンティティとして読み取られます。
ここで、トランザクションタイプをに変更しRESOURCE_LOCAL、データソースを非jtaに変更し、必要なコードを追加して、およびを呼び出す場所を取得すると、EntityManagerエラーが発生します。エンティティは既知のエンティティタイプではありません。この問題を解決するには、persistence.xmlにリストされているクラスにエンティティを追加する必要があります。 さて、それは私の問題を解決しますが、私は理由がわかりません。仕様に従って、永続ルート内のすべての注釈付きクラスは、指定されていない限り、永続ユニットによって管理される必要があります。つまり、トランザクションタイプを次のように変更したという事実EntityTransactionbegin()commit()
exclude-unlisted-classesRESOURCE_LOCAL違いはありません。
誰か答えがありますか?

編集:いくつかの追加情報。エラーの原因となる簡単なコードがいくつかあります。データベースに通貨を保存することです。永続化は次の形式で行われます。

@Named( "newCurrencyForm2" )
@RequestScoped
public class NewCurrencyForm
{
    public Currency getCurrency()
    {
        return currency;
    }

    public void createCurrency()
    {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory( "foo" );
        EntityManager manager = factory.createEntityManager();
        EntityTransaction transaction = manager.getTransaction();

        transaction.begin();
        manager.persist( currency );
        manager.getTransaction().commit();
    }

    private Currency currency = new Currency();
}

スタックトレースは次のとおりです。

java.lang.IllegalArgumentException:オブジェクト:com.test.Currency@24cce2ebは既知のエンティティタイプではありません。org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4169)at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:440)at com.test.NewCurrencyForm.createCurrency (NewCurrencyForm.java:26)com.test.NewCurrencyForm $ Proxy $ _ $$ WeldClientProxy.createCurrency(NewCurrencyForm $ Proxy $$$ _ WeldClientProxy.java)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:601)at com.sun.el.parser.AstValue.invoke(AstValue.java:254)at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302 )org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)atcom.sun.faces.facelets。 el.TagMethodExpression.invoke(TagMethodExpression.java:105)at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)at javax.faces.component.UICommand.broadcast(UICommand.java:315)at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot .java:794)at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)atcom.sun.faces.lifecycle。 Phase.doPhase(Phase.java:101)at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)at org.apache .catalina.core.StandardWrapper.service(StandardWrapper.java:1542)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)atorg.apache.catalina.core.StandardContextValve。invoke(StandardContextValve.java:175)at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)at org.apache .catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java :231)com.sun.enterprise.v3.services.impl.ContainerMapper $ AdapterCallable.call(ContainerMapper.java:317)at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195 )com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)atcom.sun.grizzly.http.ProcessorTask。process(ProcessorTask.java:1045)at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)at com.sun.grizzly .DefaultProtocolChain.execute(DefaultProtocolChain.java:104)at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)at com sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)at com.sun.grizzly.ContextTask.run(ContextTask.java:71)at com .sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:532)(com.sun.grizzly.util.AbstractThreadPool $ Worker)。run(AbstractThreadPool.java:513)at java.lang.Thread.run(Thread.java:722)

4

2 に答える 2

1

何が起こっているかについての私の推測は、トランザクション タイプが JTA として注入されているか、コンテナー管理の永続性ユニットを使用している場合です。ただし、RESOURCE_LOCAL を使用している場合は、おそらく Persistence.createEntityManagerFactory() を使用して、独自の永続ユニットを管理しています。

また、EntityManagerFactory で close() を呼び出すことはなく、永続化ユニットをライブ サーバーに再デプロイしていると思います。

サーバーを再起動するか、再デプロイする前に EntityManagerFactory を close() すると、RESOURCE_LOCAL 構成が機能すると思います。発生する可能性が最も高いのは、古いクラスを持つ古い永続化ユニットが残っているため、新しいクラスがないことです。

また、変更を行ったときに、jar を再構築し、正しく再デプロイしていることを確認してください。

于 2012-07-09T12:54:28.223 に答える
0

分析

持続性ユニットのトランザクション タイプは、マネージド持続可能クラスとは関係ありません。

管理永続クラス

JPA では、永続化ユニット定義の一部として、管理対象クラスとして JPA によって参照されるすべてのユーザー定義の永続化クラス (エンティティークラス、埋め込み可能クラス、およびマップされたスーパークラス) の登録が必要です。

解決

Currency クラスが JPA 管理の永続化可能なクラスである場合、 persistence.xmlでこのクラスの完全修飾名を指定する必要があります。

<class>com.test.Currency</class>

これにより、永続ユニット内に登録され、既知のエンティティ タイプとして認識されます。

于 2012-07-09T09:48:54.993 に答える