【问题标题】:JPA find() does not load Entity @IdJPA find() 不加载实体@Id
【发布时间】:2012-10-15 19:34:11
【问题描述】:

我开始将 JPA 与 OpenJPA API 一起使用,但我遇到了 find() 的问题。 以下是表格:

CREATE TABLE compania (
  ID int(11) NOT NULL,
  NOMBRE varchar(45) DEFAULT NULL,
  PRIMARY KEY (ID)
) 

CREATE TABLE modelo (
  ID int(11) NOT NULL,
  ID_COMPANIA int(11) DEFAULT NULL,
  NOMBRE_MODELO varchar(45) DEFAULT NULL,
  PRIMARY KEY (ID),
  KEY MODELO_COMPANIA_FK_idx (ID_COMPANIA),
  CONSTRAINT MODELO_COMPANIA_FK FOREIGN KEY (ID_COMPANIA) REFERENCES compania (ID)
) 

这是我的实体:

@Entity
public class Compania extends EntityJPA{

    private static final long serialVersionUID = 1L; 

    @Id
    private int id;

    @Column
    private String nombre;

    @OneToMany(mappedBy="compania",cascade={CascadeType.ALL})
    @JoinColumn(name="ID_COMPANIA", nullable=false)
    private List<Modelo> listaModelos;

    public Compania() {
    }

    public int getId() {
        return id;
    }

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

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombreCompania) {
        this.nombre = nombreCompania;
    }

    public List<Modelo> getListaModelos() {
        return listaModelos;
    }

    public void setListaModelos(List<Modelo> listaModelos) {
        this.listaModelos = listaModelos;
    }
}

@Entity
public class Modelo extends EntityJPA{

    private static final long serialVersionUID = 1L;

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

    @Column(name="NOMBRE_MODELO")
    private String nombreModelo;

    @ManyToOne
    @JoinColumn(name="ID_COMPANIA", referencedColumnName="ID")
    private Compania compania;

    public Modelo() {
    }

    public Compania getCompania() {
        return compania;
    }

    public void setCompania(Compania compania) {
        this.compania = compania;
    }

    public int getId() {
        return id;
    }

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

    public String getNombre() {
        return nombreModelo;
    }

    public void setNombre(String nombreModelo) {
        this.nombreModelo = nombreModelo;
    }
}

目前我正在制作

Compania cia = getEntityManager().find(Compania.class, idCompania);

cia 对象没有@Id 属性的值,它的值是 nombre 而不是 id。我的意思是:

cia.getId() = 0

它必须是 1 或 2 等等。不是 0。

非常感谢您的帮助。

我没有要持久化的代码,因为它已经持久化了。 查找的代码是

public static Compania findCompania(int idCompania){
        try {
            Compania cia = getEntityManager().find(Compania.class, idCompania);
            return cia;
        } finally {
            closeEntityManager();
        }
    }

如果我激活日志,这就是它显示的选择:

482  testMySql  TRACE  [http-bio-8080-exec-5] openjpa.jdbc.SQL - <t 1228180882, conn 1699837157> executing prepstmnt 2127861376 SELECT t0.nombre FROM Compania t0 WHERE t0.id = ? [params=(int) 1]
497  testMySql  TRACE  [http-bio-8080-exec-5] openjpa.jdbc.SQL - <t 1228180882, conn 1699837157> [15 ms] spent

如你所见,select中没有t0.id。

感谢您的帮助。

【问题讨论】:

  • cia 对象将具有与您在 find 中使用的 id 相同的值。因为find 方法从具有primary key 指定值的数据库中获取Entity 对象。那么,问题是什么?
  • 问题是没有发生。如果我希望 cia 对象具有 id 值,我必须使用 setId 方法。这正常吗??
  • @user1748035。不,这不正常。从数据库中获取 id 后,您不必设置它。其他地方有问题..
  • @user1748035。您可以将代码发布到您保存实体的位置以及获取它的位置吗?只是相关代码。
  • @user1748035.. 您是否看到您的数据库实际上是否包含具有该 ID 的条目?

标签: java jpa openjpa


【解决方案1】:

Primary Key (ID) not retrieved (?) from database using OpenJPA

重复....帖子的目的是您需要使用不同的增强方法。

【讨论】:

    【解决方案2】:

    如果您没有专门设置 @Id 属性的值,则必须使用 @GeneratedValue 声明它,以便它自动递增。

    【讨论】:

    • 我不知道是否是同一件事,但我不需要 @Id 属性自动增加。我需要它与数据库中的值相同。对不起,如果我说的和你说的一样,但我没听懂。
    • 当您尝试自己选择它时会发生什么? getEntityManager().createQuery("SELECT c FROM Compania c WHERE c.id=?") 然后设置查询的参数并获取结果。没有id还是返回吗?
    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 2015-07-31
    • 2011-04-18
    • 1970-01-01
    • 2018-12-08
    • 2018-11-13
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多