0

EJB を使用せずに JPA と JSF のみを使用してユーザー管理モジュールを設計しようとしています。java.io.NotSerializableException: org.eclipse.persistence.internal.jpa.EntityManagerImplを取得します 次のコードを持つユーザーコントローラーがあります:

@ManagedBean
@ViewScoped

public class UserController implements Serializable {

    public static final Logger logger = Logger.getLogger(UserController.class.getName());
    EntityManagerFactory emf;
    EntityManager em;
    EntityTransaction tx;
    private List<Users> users = new ArrayList<Users>();
    private List<Groups> groups = new ArrayList<Groups>();
    Groups group = new Groups();
    Users user = new Users();
    public String[] usergroups;
    boolean editGroup = false;
        boolean addGroup = false;
        boolean editUser = false;
        boolean addUser = false;

//getter and setter
}

ユーザー エンティティ:

@Entity
@Table(/*catalog = "GIS",*/ schema = "useradministration")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
    @NamedQuery(name = "Users.findByUserid", query = "SELECT u FROM Users u WHERE u.userid = :userid"),
    @NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
    @NamedQuery(name = "Users.findByUserpassword", query = "SELECT u FROM Users u WHERE u.userpassword = :userpassword"),
    @NamedQuery(name = "Users.findByFirstname", query = "SELECT u FROM Users u WHERE u.firstname = :firstname"),
    @NamedQuery(name = "Users.findByMiddlename", query = "SELECT u FROM Users u WHERE u.middlename = :middlename"),
    @NamedQuery(name = "Users.findByLastname", query = "SELECT u FROM Users u WHERE u.lastname = :lastname")})
public class Users implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
     @SequenceGenerator(name="useradministration.users_userid_seq",
                       sequenceName="useradministration.users_userid_seq",
                       allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
                    generator="useradministration.users_userid_seq")
    @Basic(optional = false)
    @Column(nullable = false)
    private Integer userid;
    @Size(max = 50)
    @Column(length = 50)
    private String username;
    @Size(max = 200)
    @Column(length = 200)
    private String userpassword;
    @Size(max = 100)
    @Column(length = 100)
    private String firstname;
    @Size(max = 100)
    @Column(length = 100)
    private String middlename;
    @Size(max = 100)
    @Column(length = 100)
    private String lastname;
    @ManyToMany(mappedBy = "usersList", fetch = FetchType.LAZY)
    private List<Groups> groupsList;

}

グループ エンティティ:

package com.ncell.user;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author suamatya
 */
@Entity
@Table(schema = "useradministration")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Groups.findAll", query = "SELECT g FROM Groups g"),
    @NamedQuery(name = "Groups.findByGroupid", query = "SELECT g FROM Groups g WHERE g.groupid = :groupid"),
    @NamedQuery(name = "Groups.findByGroupname", query = "SELECT g FROM Groups g WHERE g.groupname = :groupname"),
    @NamedQuery(name = "Groups.findByGroupdesc", query = "SELECT g FROM Groups g WHERE g.groupdesc = :groupdesc")})
public class Groups implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @SequenceGenerator(name="useradministration.groups_groupid_seq",
                       sequenceName="useradministration.groups_groupid_seq",
                       allocationSize=1)
    @GeneratedValue(strategy =  GenerationType.SEQUENCE,
                    generator="useradministration.groups_groupid_seq")
    @Basic(optional = false)
    @Column(nullable = false)
    private Integer groupid;
    @Size(max = 50)
    @Column(length = 50)
    private String groupname;
    @Size(max = 200)
    @Column(length = 200)
    private String groupdesc;
    @JoinTable(name = "useradministration.usergroups", joinColumns = {
        @JoinColumn(name = "userid", referencedColumnName = "groupid", nullable = false)}, inverseJoinColumns = {
        @JoinColumn(name = "userid", referencedColumnName = "userid", nullable = false)})
        @ManyToMany(fetch = FetchType.LAZY)
        private List<Users> usersList;
}

質問は次のとおりです。EJBなしでJPAとJSFのみの例はありますか? ビュースコープであるため、コントローラーをシリアル化可能にしました。

4

1 に答える 1

1

私は EJB を使用したことはありません。特定のエラーの原因がわかりません。ただし、Bean imo に EntityManagerFactory を含めることを再検討することをお勧めします。

代わりに、次のようなクラスで一度だけファクトリを作成します。

@ManagedBean(eager=true)
@ApplicationScoped

次に@ApplicationScoped、他のすべての Bean で拡張できる BaseBean にその Bean を依存性注入します。baseBean はファクトリから entityManager を作成し、UserController などの実際の Bean で getEntityManager() を使用するだけです。

例外は奇妙です。EntityManager はシリアライズ可能ではないため、スタックトレース全体を投稿する可能性があります。これは既知の制限です...

于 2013-09-12T07:21:47.703 に答える