2013-05-11 75 views
0

工作我使用的持久性单元和实体类的数据库,都在一个JavaFX应用FXML,我成功导入我的表,因为在我的模型实体的proble是,我得到一个异常和错误当我尝试插入一个实体,这是我的全部代码实体管理器不使用JavaFX

public class SampleController implements Initializable { 
    @PersistenceContext(unitName="RawdaPU") 
    private EntityManager em; 

    @FXML 
    private Label label; 

    @FXML 
    private void handleButtonAction(ActionEvent event) 
    { 
     Moyendidactique moyenDidactique = new Moyendidactique("1", "moyen1", "Type1"); 
     em.persist(moyenDidactique); 
     em.close(); 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) 
    { 
     // TODO 
    }  
} 

以下是完整的错误,当我按下按钮时(handleButtonAction被解雇),我得到

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28) 
    at javafx.event.Event.fireEvent(Event.java:171) 
    at javafx.scene.Node.fireEvent(Node.java:6863) 
    at javafx.scene.control.Button.fire(Button.java:179) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193) 
    at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336) 
    at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33) 
    at javafx.event.Event.fireEvent(Event.java:171) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3324) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3164) 
    at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3119) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1559) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2261) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:228) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:528) 
    at com.sun.glass.ui.View.notifyMouse(View.java:922) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29) 
    at com.sun.glass.ui.win.WinApplication$2$1.run(WinApplication.java:67) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.reflect.InvocationTargetException 
    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 javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1435) 
    ... 41 more 
Caused by: java.lang.NullPointerException 
    at rawda.Controller.SampleController.handleButtonAction(SampleController.java:37) 
    ... 46 more 

我找不到在已经存在的类似问题中的答案,无法确切地知道我是什么失踪,提前感谢帮助。

+0

你在这里有空指针异常:rawda.Controller.SampleController.handleButtonAction(SampleController.java:37)它是你的代码...看起来像em是空的... – 2013-05-11 11:17:07

+0

关于@PersistenceContext初始化的规则是什么? – 2013-05-11 11:19:48

+0

事实上它那空,我刚刚检查出来,但问题是我有很多教程只是使用EntityManager只是我做的,相信我失去了一些东西,有件事更何况,我一直在使用Java进行仅两个星期我有点新的给它 – AymenDaoudi 2013-05-11 11:22:08

回答

4

为什么你在你的代码

@PersistenceContext注解得到一个NullPointerException“表示在容器管理的EntityManager及其相关的持久化上下文的依赖。”

默认情况下FXML控制器不是容器管理的,这意味着他们不会设置容器管理的成员,如标记为@PersistenceContext的成员。

您可以通过定义一个controller factory您FXMLLoader使用FXML控制器在容器管理环境(例如作为InjectionProvider用于注入值插入在Afterburner.fx framework)。

但实际上,你并不需要做注射,如果你是刚刚开始使用Java。在你习惯之前,inversion of control stuff可能会增加太多魔法。

推荐JavaFX的集成方法尝试使用JPA初学者

相反,不依靠@PersistenceContext注释。直接从实体经理工厂参考获取实体经理。还有就是java2s样品Create Query From Entity Manager在使用容器管理环境之外一个EntityManager的一个很好的例子。

在您的应用程序提供一种机制来获取实体管理器:

public class SampleApplication extends Application { 
    static private EntityManagerFactory emf; 
    static { 
    try { 
     emf = Persistence.createEntityManagerFactory("RawdaPU"); 
    } catch (Exception e) { 
     System.out.println("Fatal: Unable to create entity manager factory"); 
     e.printStackTrace(); 
    } 
    } 

    static public EntityManager createEntityManager() { 
    return emf.createEntityManager(); 
    } 

    @Override 
    public void start(Stage stage) { 
    . . . 
    } 
} 

在你的控制,从应用程序中获得的实体管理器并使用它作为必要的。

class SampleController implements Initializable { 
    @FXML 
    private Label label; 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 
    EntityManager em = SampleApplication.createEntityManager(); 
    Moyendidactique moyenDidactique = new Moyendidactique("1", "moyen1", "Type1"); 
    em.persist(moyenDidactique); 
    em.close(); 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) {} 
} 

在关闭和实体管理器寿命的

因为你原来的例子中,坚持语句后关闭实体管理器,让我感动的实体管理器创建成方法同样的接近方法,使他们匹配。密切意味着实体管理器无法再次使用,所以你不妨在您关闭它在同一个地方创建它 - 这样,你不能错误地重用它在其他地方。请注意,您不需要做亲密这样的,如果你喜欢可以重用实体管理器,但对于入门JPA,只是做它作为在这个例子中答案很可能很好,你可以看看更复杂的实体管理器重复使用场景,因为您可以获得更多的技术经验和信心。

并发参与讨论

您还需要了解在应用程序中使用JPA的并发集成。直接在按钮的动作处理程序中执行诸如JPA调用之类的操作通常不是一个好主意,因为这些调用会阻止I/O,从而暂停JavaFX应用程序线程并冻结应用程序UI一段时间。相反,最好是利用JavaFX task and service concurrency utilities的处理方式类似,数据库工作从JavaFX JDBC task sample UI线程抽象JPA互动。

对于一个小型的本地数据库来说,并发可能不是那么重要,所以你可以试试你的应用第一个单线程,如果它能正常工作,那么很好,但如果它冻结了,那就查看并发实用程序。

下一步

上述方法真的是一个快速入门的事情。

一旦你理解了这个简单的方法,你可能想看看在afterburner.fxairhacks-control框架或(更重量级)javafx/jpa/spring framework integration中演示的更结构化设计。

+0

我明白你说的是什么,但你添加到SampleApplication类的静态代码仍然会抛出异常: 致命:无法创建实体管理器工厂 本地异常堆栈: 异常[EclipseLink-30005](Eclipse持久性服务 - 2.3.2.v20111125-r10461):... org.eclipse.persistence.exceptions.EntityManagerSetupException 异常说明:PersistenceUnit [RawdaPU]失败部署前的。 防止emf被指定为entitymanager之后,提及我正在使用NetBeans,并且我只是按照您的解释继续。 – AymenDaoudi 2013-05-11 14:14:33

+0

几乎尝试了所有的东西,可能不会得到电动势被coorectly初始化 – AymenDaoudi 2013-05-11 16:16:02

+0

这是一个不同的问题比最初发布的。创建一个新的问题,其中包括一个[sscce](http://sscce.org/),完整的环境描述(Eclipselink版本等)和完整的堆栈跟踪。看看你是否可以独立地获得我的工作答案中链接的java2s示例。 – jewelsea 2013-05-11 19:14:19