繁体   English   中英

对象持久性不起作用

[英]Object persistence doesn't work

我正在尝试与JPA进行一些聊天。 一切正常,只有一件事。 我想当用户打开与endPoint的连接时,保存他的房间号,昵称和timstamp。 我的表已经很好地创建了,列也很好,但是我不能将Connexion对象保留在数据库中。

我正在使用Glasfish 4.0,并且已经创建了运行良好的JDBCRessources和JDBC Connection池。

这是我的ChatEndPoint.Java

package server;

import java.io.IOException;

import javax.websocket.EncodeException;
import javax.websocket.EndpointConfig;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

    @ServerEndpoint(value = "/websocket/{room-name}/{nick-name}", encoders = { ChatMessageEncoder.class }, decoders = { ChatMessageDecoder.class })
    public class ChatEndPoint {

        // traitement de la connexion d'un client
        @OnOpen
        public void open(Session session, EndpointConfig conf, @PathParam("room-name") String roomName, @PathParam("nick-name") String nickName) throws Exception {
            System.out.println("connection ouverte");
            session.getUserProperties().put("salle", roomName);
            DAO dao=new DAO();
            dao.createConnection(nickName, roomName);

        }

        // traitement de la reception d'un message client
        @OnMessage
        public void onMessage(Session session, ChatMessage msg) throws IOException,
                EncodeException {

            if (msg instanceof ChatMessage) {

                ChatMessage reponse = new ChatMessage(msg.getEmetteur(),
                        msg.getSalle(), msg.getMessage());

                for (Session sess : session.getOpenSessions()) {
                    if (sess.isOpen()
                            && sess.getUserProperties().get("salle")
                                    .equals(msg.getSalle()))
                        sess.getBasicRemote().sendObject(reponse);
                }

            }

        }
    }

代表我要保存的实体的Connexion类:

Connexion.java

package server;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;


@Entity
public class Connexion implements Serializable {

    private static final long serialVersionUID = 1L;

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

    @NotNull
    @Column( name = "nickName" )
    protected  String nickName;

    @NotNull
    @Column( name = "roomName" )
    protected  String roomName;

    @Column( name = "dateConnexion" )
    protected  Timestamp connectionDate;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getRoomName() {
        return roomName;
    }

    public void setRoomName(String roomName) {
        this.roomName = roomName;
    }

    public Timestamp getConnectionDate() {
        return connectionDate;
    }

    public void setConnectionDate(Timestamp timestamp) {
        this.connectionDate = timestamp;
    }
}

DAO.java

package server;

import java.sql.Timestamp;

import javax.ejb.LocalBean;
import javax.ejb.Stateful;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;


@Stateless
@LocalBean
public class DAO {

    @PersistenceUnit
    private EntityManagerFactory emf;

    // Injection du manager, qui s'occupe de la connexion avec la BDD
    @PersistenceContext(unitName="projetwebee1")
    EntityManager em;



    // Enregistrement d'un nouvel utilisateur
    public void createConnection(String nickName, String roomName) throws Exception{
        this.emf=Persistence.createEntityManagerFactory("projetwebee1");
        this.em = this.emf.createEntityManager();

        Connexion c = new Connexion();
        c.setNickName(nickName);
        c.setRoomName(roomName);
        c.setConnectionDate(new Timestamp((new java.util.Date()).getTime()));
        System.out.println(" "+em);
        em.persist(c);
        System.out.println("persist OK");

    }
}

JPA生成的persistence.xml。 但是我编辑了一部分

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="projetwebee1" transaction-type="JTA">
        <jta-data-source>JEEProjectJNDIFinal3</jta-data-source>
        <properties>
            <property name="eclipselink.ddl-generation" value="create-tables" />

        </properties>


    </persistence-unit>
</persistence>

因此,在尝试保留实体后,我无法在数据浏览器中看到它。 除了在官方文档甚至在这里找到的方法之外,我已经尝试了许多其他方法。 但是没有人能成功。

谢谢你的帮助

EJB容器在您的bean中注入了一个实体管理器,但是您将其丢弃并由您自己创建的一个替换。 所有你需要的是

@Stateless
@LocalBean
public class DAO {

    @PersistenceContext
    EntityManager em;

    public void createConnection(String nickName, String roomName) {
        Connexion c = new Connexion();
        c.setNickName(nickName);
        c.setRoomName(roomName);
        c.setConnectionDate(new Timestamp((new java.util.Date()).getTime()));
        em.persist(c);
    }

但是问题是,您不是自己让容器创建该EJB,而是自己实例化了,将应该是可注入的,可交易的EJB转换为不受EJB容器管理的哑对象。 永远不要使用new获得EJB的实例。 使用依赖注入。

代替

@ServerEndpoint(value = "/websocket/{room-name}/{nick-name}", encoders = { ChatMessageEncoder.class }, decoders = { ChatMessageDecoder.class })
public class ChatEndPoint {

    // traitement de la connexion d'un client
    @OnOpen
    public void open(Session session, EndpointConfig conf, @PathParam("room-name") String roomName, @PathParam("nick-name") String nickName) throws Exception {
        System.out.println("connection ouverte");
        session.getUserProperties().put("salle", roomName);
        DAO dao=new DAO();
        dao.createConnection(nickName, roomName);

采用

@ServerEndpoint(value = "/websocket/{room-name}/{nick-name}", encoders = { ChatMessageEncoder.class }, decoders = { ChatMessageDecoder.class })
public class ChatEndPoint {

    @Inject
    private DAO dao;

    // traitement de la connexion d'un client
    @OnOpen
    public void open(Session session, EndpointConfig conf, @PathParam("room-name") String roomName, @PathParam("nick-name") String nickName) throws Exception {
        System.out.println("connection ouverte");
        session.getUserProperties().put("salle", roomName);
        dao.createConnection(nickName, roomName);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM