私は以下を使用します:
- 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 のどこにでも挿入して、それを内部で使用してレイアウトを作成することです。EntityManager
Member
UI
CustomComponent
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 プロジェクト内) にServlet
はUI
. アプリケーション内のナビゲーションは を介して行われNavigator
、その他Servlets
は不要です。静的での注入はServlet
私には間違っているように感じましたが、そのアプローチを試みました。また、NullPointerException
.
3 番目のアプローチ: vaadin.comJPAContainer
に記載されているように、を使用します。これはほとんど機能していましたが、. クラスのコードを参照してください。ServletException
Members
それは以下を引き起こしました:
javax.servlet.ServletException: com.vaadin.server.ServiceException: java.lang.IllegalStateException: Exception 説明: JTA の使用中は EntityTransaction を使用できません。
なぜこれが出てくるのか説明できません。
私の最後のアプローチは、このフォーラム スレッドに従うことでしたが、NullPointerException
. それに、回避策のように見えるので、あまり使いたくありません。
を使用したいのですJPAContainer
が、Vaadin 内で JPA を使用する一般的な通常の方法が実際に役立ちます。
それでおしまい。助けてください:-) 助けてくれてありがとう!