1

私は以下を使用します:

  • Eclipse Java EE ジュノ
  • グラスフィッシュ 3.1.2、
  • ダービーDB、
  • JPA、
  • EclipseLinkと
  • ヴァーディン 7.1.1.

その上、私はGlassfish、DerbyDB、JPA、EcliseLink、およびVaadinを初めて使用します:-)間違っている場合は修正してください!


まず、 classを使った例Applicationがいくつかありますが、これは Vaadin 6 に関するものなので、私にはできません。

JPA を使用して Derby DB にエンティティーを永続化したいのですがMember、2 日間それを行うのに問題があります。私がやろうとしているのは、エンティティを管理するステートレス EJBMemberManagerBeanをVaadin のどこにでも挿入して、それを内部で使用してレイアウトを作成することです。EntityManagerMemberUICustomComponent

package de.ves.beans.entities;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Version;

@Entity
public class Member implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Version
    @Column(name = "OPTLOCK")
    private Long version;

    protected String name;

    public Member(){}

    // getters and setters ...

}

package de.ves.beans.mgm;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import de.ves.beans.entities.Member;

@Stateless
public class MemberManagerBean implements MemberManagerLocal {

    @PersistenceContext
    protected EntityManager entityManager;

    @Override
    public Member getMember(Long id) {
        return entityManager.find(Member.class, id);
    }

    @Override
    public Member saveMember(Member member) {
        if (member.getId() == null){
            entityManager.persist(member);
        }else{
            entityManager.merge(member);
        }
        return member;
    }

}

package de.ves.beans.mgm;

import javax.ejb.Local;
import javax.ejb.TransactionAttribute;

import de.ves.beans.entities.Member;

@TransactionAttribute
@Local
public interface MemberManagerLocal {

    public Member getMember(Long id);

    public Member saveMember(Member member);

}

package de.ves.ui;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.Title;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.navigator.Navigator;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.UI;

import de.ves.beans.mgm.MemberManagerBean;
import de.ves.club.Friends;
import de.ves.club.Members;
import de.ves.club.News;
import de.ves.contact.About;
import de.ves.home.Home;
import de.ves.media.Pics;
import de.ves.media.Videos;

@SuppressWarnings("serial")
@Theme("ves")
public class VesUI extends UI {

    private Navigator navigator;

    @WebServlet(value = "/*", asyncSupported = true)
    @VaadinServletConfiguration(productionMode = false, ui = VesUI.class)
    public static class Servlet extends VaadinServlet {

    }

    @Override
    protected void init(VaadinRequest request) {
        navigator = new Navigator(this, this);

        // Home

        MainLayout main = new MainLayout();
        main.setMiddle(new Home());
        navigator.addView(Home.PATH, main); 

        // ErrorView

        navigator.setErrorView(main);

        // Subpages

        main = new MainLayout();
        main.setMiddle(new Members());
        navigator.addView(Members.PATH, main);

                    // ...

    }

}

package de.ves.club;

import com.vaadin.addon.jpacontainer.JPAContainer;
import com.vaadin.addon.jpacontainer.JPAContainerFactory;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.server.FileResource;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;

import de.ves.beans.entities.Member;

@SuppressWarnings("serial")
public class Members extends CustomComponent {


            // Components and stuff...


    public Members() {
        buildMainLayout();
        setCompositionRoot(mainLayout);

        pnl_root.setSizeFull();

        // Several inits...

                    // This is where I want to read/write from/into the DB.
                    // This is not possible since I can't access the 
                    // MemberManagerBean. The following code shows my approach
                    // concering with a JPAContainer.

        JPAContainer<Member> members = JPAContainerFactory.make(Member.class, "vesPersistence");
        Member m = new Member();
        members.addEntity(m);

    }

    @AutoGenerated
    private VerticalLayout buildMainLayout() {
        // ...
    }

            // ...

}

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      http://java.sun.com/xml/ns/persistence
      http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="vesPersistence">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>de.ves.beans.entities.Member</class>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.target-database" value="Derby" />
            <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/ves;create=true" />
            <property name="javax.persistence.jdbc.user" value="admin" />
            <property name="javax.persistence.jdbc.password" value="..." />
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
            <property name="eclipselink.logging.level" value="INFO" />
        </properties>
    </persistence-unit>
</persistence>

私の最初のアプローチは、EJB をCustomComponent...

    @EJB
    private MemberManagerBean memberManager;

...しかし、これはNullPointerException.

インジェクションは でのみ機能することを読みましたServlet。(これは正しいですか?)


さて、問題は、一般的な DWP とは異なり、Vaadin プロジェクト (MY Vaadin プロジェクト内) にServletUI. アプリケーション内のナビゲーションは を介し​​て行われNavigator、その他Servletsは不要です。静的での注入はServlet私には間違っているように感じましたが、そのアプローチを試みました。また、NullPointerException.


3 番目のアプローチ: vaadin.comJPAContainerに記載されているように、を使用します。これはほとんど機能していましたが、. クラスのコードを参照してください。ServletExceptionMembers

それは以下を引き起こしました:

javax.servlet.ServletException: com.vaadin.server.ServiceException: java.lang.IllegalStateException: Exception 説明: JTA の使用中は EntityTransaction を使用できません。

なぜこれが出てくるのか説明できません。


私の最後のアプローチは、このフォーラム スレッドに従うことでしたが、NullPointerException. それに、回避策のように見えるので、あまり使いたくありません。


を使用したいのですJPAContainerが、Vaadin 内で JPA を使用する一般的な通常の方法が実際に役立ちます。

それでおしまい。助けてください:-) 助けてくれてありがとう!

4

0 に答える 0