Serialization 爪哇及;EJB3:如何正确地将@Entity对象从客户端传递到服务器?

Serialization 爪哇及;EJB3:如何正确地将@Entity对象从客户端传递到服务器?,serialization,jpa,ejb,entity,rmi,Serialization,Jpa,Ejb,Entity,Rmi,我目前正试图通过调用由Netbeans(实体类会话bean向导)自动生成的外观上的业务方法,将@Entity对象从独立客户端传递到服务器企业应用程序 @Entity类由两个字符串字段组成。但是当对象到达服务器端时,所有字段都是“null”,尽管在调用facade的远程方法之前,我在客户端正确地初始化了entity对象,而facade应该将对象存储到我的MySQL数据库中(事实上,它是存储的,但是带有那些null引用)。没有错误,除了将@Entity对象从客户端传递到服务器之外,其他一切都正常工作

我目前正试图通过调用由Netbeans(实体类会话bean向导)自动生成的外观上的业务方法,将@Entity对象从独立客户端传递到服务器企业应用程序

@Entity类由两个字符串字段组成。但是当对象到达服务器端时,所有字段都是“null”,尽管在调用facade的远程方法之前,我在客户端正确地初始化了entity对象,而facade应该将对象存储到我的MySQL数据库中(事实上,它是存储的,但是带有那些null引用)。没有错误,除了将@Entity对象从客户端传递到服务器之外,其他一切都正常工作

反之亦然。我在表中手动添加了一行,并调用facade的远程业务方法find(objectid),以便将db条目返回给客户端。编组在这个方向上工作得很好

基本上,它由3个项目组成(类附在底部):

  • EnterpriseApp/EJB:保存facade和JDBC到MySQL的连接的实现
  • Java类库:保存远程业务方法和实体bean的接口(此接口由服务器端和客户端共享(引用)
  • Java应用程序:构建InitialContext并执行JNDI查找,以获取对facade的远程业务方法的引用
  • 我现在面对这个问题已经两天了,没有人知道如何解决。互联网搜索完全失败。因此,任何想法都将受到高度赞赏-提前感谢

    任何想法都将受到高度赞赏

    A1)EJB/企业应用程序:下面是抽象门面类(由Netbeans自动生成):

    B2)共享类库:远程facade接口:

    @Remote
    public interface UserFacadeRemote {
        void create(User user);
        void edit(User user);
        void remove(User user);
        User find(Object id);
    }
    
    C) 客户端Java应用程序:

    public class LawSuiteSE {
    
        private static UserFacadeRemote ctrlUser;
    
        public LawSuiteSE() {
            try {
                Properties props = new Properties();
                props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.6");
                props.put("org.omg.CORBA.ORBInitialPort", "3700");
                InitialContext ctx = new InitialContext(props);
                ctrlBenutzer = (BenutzerFacadeRemote)ctx.lookup("java:global/LawSuiteEE/LawSuiteEE-ejb/UserFacade!control.UserFacadeRemote");
                User user1 = new User();
                user1.setUsername("testusr");
                user1.setPassword("testpwd");
                ctrlUser.create(user1);
                User user2 = ctrlUser.find(1L);
                System.out.println("username: "+user2.getUsername());
                System.out.println("password: "+user2.getPassword());
            } catch (NamingException ex) {
                System.err.println(ex.getMessage());
            }
        }
    
        public static void main(String[] args) {
            LawSuiteSE lsse = new LawSuiteSE();
        }
    
    }
    

    我猜它与您定义的serialVersionUID或您正在使用的CORBA序列化程序有关。不确定您是否可以尝试常规RMI。尝试仅在客户端上序列化/反序列化对象,是否有效?也可以在服务器上尝试

    我猜客户端和服务器中的类版本在某种程度上是不同的。这很可能与JPA如何在服务器上编织类有关。尝试在persistence.xml中禁用编织,这能解决问题吗

    如果是这样,那么尝试使用jar的静态编织,这样客户机和服务器都共享同一个jar


    您使用的是什么版本的Glassfish和JDK?我们有类似的测试,从Glassfish中的客户端调用远程会话bean,它们没有任何问题。

    Hi barsju-我在初始消息中将实体代码发布为edit。。。我真的很沮丧。我花了整整一周的时间正确设置GlassFish服务器,以便与ACC进行远程通信,现在这个问题又出现了两天:-(我在互联网上找不到任何信息..非常奇怪,你能将一个对象从服务器序列化到客户端吗?如果你删除serialVersionUID怎么办?会话bean代码怎么办?实体是否保存在数据库中?顺便说一句,AFAIK MySql不支持序列生成策略。请参阅.hi waclaw-我的示例I中的会话bean代码s用@Stateless注释的UserFacade类。是的,实体在数据库中保持不变,但使用“null”用户名和密码字段的值。好的,谢谢关于顺序策略的提示,我暂时切换到自动。还有什么想法吗?嗨,詹姆斯-在persistence.xml中禁用编织完成了!!!非常非常感谢!我在Ubuntu11.10和JDK1.6.030上使用GlassFish 3.1.2。那么,我如何使用静态编织呢静态编织的eclipse链接:您是否尝试删除serialVersionUID并保持编织启用?对结果感兴趣。@詹姆斯:我在通过entityDetail列表时面临类似的问题。我使用的是Glassfish v2.1和JDK 1.6。但是Glassfish v3.1.2没有出现此问题!出于某些原因,我无法切换到更新的Glassfish。可以吗你能给我一些建议吗?谢谢
    @Entity
    public class User implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        private Long id;
        private String username;
        private String password;
    
        public User() { }
    
        public User(Long id) {
            this.id = id;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public Integer getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    }
    
    @Remote
    public interface UserFacadeRemote {
        void create(User user);
        void edit(User user);
        void remove(User user);
        User find(Object id);
    }
    
    public class LawSuiteSE {
    
        private static UserFacadeRemote ctrlUser;
    
        public LawSuiteSE() {
            try {
                Properties props = new Properties();
                props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.6");
                props.put("org.omg.CORBA.ORBInitialPort", "3700");
                InitialContext ctx = new InitialContext(props);
                ctrlBenutzer = (BenutzerFacadeRemote)ctx.lookup("java:global/LawSuiteEE/LawSuiteEE-ejb/UserFacade!control.UserFacadeRemote");
                User user1 = new User();
                user1.setUsername("testusr");
                user1.setPassword("testpwd");
                ctrlUser.create(user1);
                User user2 = ctrlUser.find(1L);
                System.out.println("username: "+user2.getUsername());
                System.out.println("password: "+user2.getPassword());
            } catch (NamingException ex) {
                System.err.println(ex.getMessage());
            }
        }
    
        public static void main(String[] args) {
            LawSuiteSE lsse = new LawSuiteSE();
        }
    
    }