如果@EmbeddedId的任意字段值为null,会出现什么问题?

aic*_*pom 4 hibernate nullpointerexception composite-primary-key

我正在获取 Hibernate @EmbeddedId 的问题。我的@EmbeddedId的代码是:

@Embeddable
public class EnrolRegEmbededId implements Serializable
{
 @Column(name="ENROL_NO")
private String enrolNo;
@Column(name="REG_NO")
private String regNo;
}
Run Code Online (Sandbox Code Playgroud)

我的实体类是:

@Entity
@Table(name = "PTAX_ENROL_REG_PRINCIPAL_INFO")
public class Enrol_reg_principal_info implements Serializable {

@EmbeddedId
private EnrolRegEmbededId enrolReg;
@Column(name = "APPLN_TYPE")
private String type;
@Column(name = "FIRST_NM")
private String f_name;
@Column(name = "MIDDLE_NM")
private String m_name;
@Column(name = "LAST_NM")
}
Run Code Online (Sandbox Code Playgroud)

问题是:当 enrolNo 和 regNo 都有值时,我从“Enrol_reg_principal_info”类获取数据。但当 enrolNo 或 regNo 有值时,会出现 NUllPointerException。

hql 是: String hql = " from Enrol_reg_principal_info prin where prin.enrolReg.regNo=:id"; 用于获取 regNo 的值。

String hql = " from Enrol_reg_principal_info prin where prin.enrolReg.enrolNo=:ec"; 用于获取 enrolNO 的值。

方法是:

public EnrolRegPrinModel masterDetailsEC(String EC) throws Exception {
EnrolRegPrinModel ecDetails = new EnrolRegPrinModel();
Enrol_reg_principal_info info = new Enrol_reg_principal_info();

Session s = null;
try {
 s = sessionFactory.openSession();
String hql = " from Enrol_reg_principal_info prin where 
prin.enrolReg.enrolNo=:ec";
  Query q = s.createQuery(hql);
  q.setString("ec", EC);
info = (Enrol_reg_principal_info) q.uniqueResult();
} catch (Exception ex) {
 ex.printStackTrace();
} finally {
 s.close();

 }
 return ecDetails;
}
Run Code Online (Sandbox Code Playgroud)

请帮忙。提前致谢

Kar*_*k R 5

当您说 时EmbeddedId,它表示一个复合主键,它需要一个非空且唯一的值。JPA 期望这些列不为空并且是唯一的。据此选择您的列。

休眠参考: http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite-aggreated

另外,我不确定您是否已经有了 getter 和 setter。嵌入的 id 类需要正确equals()设置hashcode()方法。

  • @codeLover,我同意 Karthik 的观点,这回答了问题。问题不在于查询,而在于实体类的建模方式。正如上面引用的 jboss 文档中所述,“对于复合 ID,任何部分都不能为空”。如果列包含空值,则 EmbeddedId 不适合对组合键进行建模。 (2认同)