当前位置: 首页 > 知识库问答 >
问题:

JPA2.1实体,为什么我总是得到实体的self而不是实体的主键?

芮朗
2023-03-14
package com.longz.ozssc.domain;

import javax.persistence.*;
import java.sql.Time;
import java.util.Arrays;

/**
 * Created by cidylong on 12/01/2015.
*/
@Entity
@Table(name = "file", schema = "public", catalog = "ozssc")
public class FileEntity {
    private String fileId;
    private String referId;
    private String fileName;
    private String fileType;
    private byte[] fileData;
    private Time createdDatatime;

@Id
@Column(name = "file_id", nullable = false, insertable = true, updatable = true, length = 2147483647)
public String getFileId() {
    return fileId;
}

public void setFileId(String fileId) {
    this.fileId = fileId;
}

@Basic
@Column(name = "refer_id", nullable = false, insertable = true, updatable = true, length = 2147483647)
public String getReferId() {
    return referId;
}

public void setReferId(String referId) {
    this.referId = referId;
}

@Basic
@Column(name = "file_name", nullable = false, insertable = true, updatable = true, length = 2147483647)
public String getFileName() {
    return fileName;
}

public void setFileName(String fileName) {
    this.fileName = fileName;
}

@Basic
@Column(name = "file_type", nullable = true, insertable = true, updatable = true, length = 2147483647)
public String getFileType() {
    return fileType;
}

public void setFileType(String fileType) {
    this.fileType = fileType;
}

@Basic
@Column(name = "file_data", nullable = false, insertable = true, updatable = true)
public byte[] getFileData() {
    return fileData;
}

public void setFileData(byte[] fileData) {
    this.fileData = fileData;
}

@Basic
@Column(name = "created_datatime", nullable = false, insertable = true, updatable = true)
public Time getCreatedDatatime() {
    return createdDatatime;
}

public void setCreatedDatatime(Time createdDatatime) {
    this.createdDatatime = createdDatatime;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    FileEntity that = (FileEntity) o;

    if (createdDatatime != null ? !createdDatatime.equals(that.createdDatatime) : that.createdDatatime != null)
        return false;
    if (!Arrays.equals(fileData, that.fileData)) return false;
    if (fileId != null ? !fileId.equals(that.fileId) : that.fileId != null) return false;
    if (fileName != null ? !fileName.equals(that.fileName) : that.fileName != null) return false;
    if (fileType != null ? !fileType.equals(that.fileType) : that.fileType != null) return false;
    if (referId != null ? !referId.equals(that.referId) : that.referId != null) return false;

    return true;
}

@Override
public int hashCode() {
    int result = fileId != null ? fileId.hashCode() : 0;
    result = 31 * result + (referId != null ? referId.hashCode() : 0);
    result = 31 * result + (fileName != null ? fileName.hashCode() : 0);
    result = 31 * result + (fileType != null ? fileType.hashCode() : 0);
    result = 31 * result + (fileData != null ? Arrays.hashCode(fileData) : 0);
    result = 31 * result + (createdDatatime != null ? createdDatatime.hashCode() : 0);
    return result;
}
@Override
public String toString() {
    return "com.longz.ozssc.model.FileEntity[ fileId=" + fileId + " ]";
}

}

我的远程接口是:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.longz.ozssc.remote;

import com.longz.ozssc.model.FileEntity;
import java.util.List;
import javax.ejb.Remote;

/**
 *
 * @author cidylong
*/
@Remote
public interface FileEntityFacadeRemote {

  void create(FileEntity fileEntity);

  void edit(FileEntity fileEntity);

  void remove(FileEntity fileEntity);

  FileEntity find(Object id);

  List<FileEntity> findAll();

  List<FileEntity> findRange(int[] range);

  int count();

}

我的EJB实现是:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.longz.ozssc.ejb;

import com.longz.ozssc.model.FileEntity;
import com.longz.ozssc.remote.FileEntityFacadeRemote;
import com.longz.ozssc.remote.OzsscIdSequenceFacadeRemote;
import com.longz.ozssc.utils.datatime.DateTimeAssistant;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.lang3.StringUtils;

/**
 *
 * @author cidylong
 */
@Remote(FileEntityFacadeRemote.class)
@Stateless(mappedName="fileEntityFacadeEJB")
public class FileEntityFacade extends AbstractFacade<FileEntity> implements FileEntityFacadeRemote {
    @PersistenceContext(unitName = "OzsscJPANBPU")
    private EntityManager em;

  @Override
  protected EntityManager getEntityManager() {
    return em;
}

  public FileEntityFacade() {
    super(FileEntity.class);
}

  @EJB
  private OzsscIdSequenceFacadeRemote ozsscIdSqFaRemote;

  @Override
  public List<FileEntity> findAll(){
    Query query = em.createNamedQuery("FileEntity.findAllOrderByCreated");
    return new LinkedList<FileEntity>(query.getResultList());
    /*return super.findAll();*/
}

}

每次当我调用实体方法getFileId()时,

 String fileId = (FileEntity)fileEntity.getFileId();
**FILES20150200013**. 
**com.longz.ozssc.model.FileEntity[ fileId= FILES20150200013 ]**

编辑:

当我试图使用JPA2.0提供的方法访问实体的主键时:

Object identifier = 
                EntityManagerFactory.getPersistenceUnitUtil().getIdentifier(fileEntity);

我得到了同样的错误回报。烦人??

共有1个答案

杜俊远
2023-03-14

我自己发现了这个问题。

其实。我用java客户端包括WebLogic客户端库测试了它,我发现它在java客户端中工作得很好。

然后,我把相同的测试代码放在Spring MVC上下文中,而不是工作。Spring MVC控制器总是给出错误的返回值。很好笑。

 类似资料:
  • 我有这样的Jpa存储库:

  • 我使用的是Hibernate4,启用了惰性加载。我有一个包含对其他对象的引用的基本实体。下面是一个简单的例子: 当我从数据库加载Employee实体时,boss对象由一个Hibernate代理对象表示,这是由于延迟加载的原因。稍后我需要访问boss属性,该属性可能在加载它的同一会话中,也可能不在同一会话中。如果我尝试使用boss对象,但它还没有加载,而我处于不同的位置,我将得到以下错误: 我真的想

  • 我有两个实体与单向@OneTo多项映射: 我想获得所有B实体的列表,它们是匹配限制的A实体的子实体。 这就是我卡住的地方:c.list()将返回给我一个对象列表。我不关心A,我想要B。我如何使用Hibernate标准/预测来完成它?如果有关系,我使用Hibernate 4.2.12 在这种简化的情况下,只是急切地去拿是有意义的;在真实的例子中,有一个由四个一对一的单向关联组成的链,我想让所有(或者

  • null Spring-web有没有可能在调用Jersey之前消耗InputStream? 请帮帮我. 编辑 我的回答是 芭芭拉 我的控制台输出是

  • 我整天都在尝试将实体保存到MySQL数据库中,遇到了巨大的困难。我正在使用NestJS和TypeORM。 教师实体ts app.module.ts 以下是错误: 该实体实际上保存在数据库中,但NestJS需要整整一分钟才能完成此任务并返回响应。我正在使用Angular,它等待这个响应,以便在注册为教师后将用户重定向到登录页面。在发送post请求在数据库中创建教师后,我仅在一分钟内收到状态为500的

  • 我看到了几个类似的问题,但没有一个对我有效的答案。我正致力于将一个现有的项目转换为使用Hibernate。我正在使用Mysql作为数据库。我有一节课是这样的: 像这样的类: 当我从数据库中获取项时,我将其转换为JSON,最后得到如下格式的结果: 我找到了这个消除错误的答案,但是JSON对象与我添加之前完全相同。在某种程度上,转换到JSON会添加忽略的值。 我使用转换到JSON的方法如下: