EclipseLink JPA em.persist以静默方式失败

时间:2013-12-23 15:49:52

标签: java java-ee jpa

我有大量工作的EJB都正确持久化数据,然后就是这个没有持久存储到数据库或返回任何错误,它与其他EJB的唯一区别是它使用CDI @Inject两次

泽西资源:

@Path("/file")
@Stateless
public class FileResource extends Application
{
    @Inject
    private LibraryController libraryController; //getters setters omitted

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadWeb(InputStream inputStream)
    {
       getLibraryController().uploadFile();
    }
}

CDI Bean:

@Named
@SessionScoped
public class LibraryController implements Serializable
{
    @Inject
    private FileEJBLocal fileEJB; //getters setters omitted

    uploadFile()
    {
            File rootFile = new File();
            try
            {
                getFileEJB().create(rootFile);
            }
            catch (Exception ex)
            {
                Logger.getLogger(LibraryController.class.getName()).log(Level.SEVERE, null, ex);
            }
     }
}

EJB Bean:

@Stateless
public class FileEJB implements FileEJBLocal
{

    @PersistenceContext(unitName = "myPersistenceUnit")
    private EntityManager em;

    @Override
    public File create(File file) throws Exception
    {
        em.persist(file);
        return file;
    }
}

现在奇怪的是,如果不存在LibraryController并且我直接从Jersey Resource调用了EJB Bean,那么它将持续存在而没有错误。

更奇怪的是注入工作正常,并且在调试时,使用非null文件对象正确调用create(文件文件)方法!

编辑:我正在逐行仔细调试并使用phpmyadmin检查mysql数据库以查看文件何时实际持久化,以下是一种奇怪的行为:如果我持久保存文件并随后请求它使用以下代码

        File File = new File();
        File.setUuid("fffffffffabababbaba");
        File.setId(new Long("129998"));
        try
        {  getFileEJB().create(File);
        }
        catch (Exception ex)
        { // log error
        }
        try
        {  File FileReturned = getFileEJB().getFileById(new Long("129998"));
        }
        catch (Exception ex)
        { // log error
        }

正确返回了FileReturned但是phpmyadmin显示数据库没有与文件一起保存。我开始认为不可能同时调试和检查数据库,可能数据是否存在于某些缓冲区表中? 也许是因为我正在使用Mysql连接池?

有什么想法吗?

注意:我正在使用Glassfish 4.0 Jersey 2.0和EclipseLink,但这不应该特定于此配置。

0 个答案:

没有答案