如果@EmbeddedId的任何字段值为null,将出现哪个问题?

问题描述 投票:0回答:2

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

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

我的实体类是:

@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")
}

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

hql是:String hql =“from Enrol_reg_principal_info prin,其中prin.enrolReg.regNo =:id”;获取regNo的值。

字符串hql =“来自Enrol_reg_principal_info prin,其中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;
}

请帮忙。提前致谢

hibernate nullpointerexception composite-primary-key
2个回答
1
投票

我认为问题是你试图通过uniqueResult方法获取结果。由于它是一个复合主键,因此对于你发送的ec有可能在数据库中有多个记录,并且有一个uniqueResult的拇指规则,你应该只获取一个结果(即使没有找到记录,那么你也是将面临例外)。

尝试将结果提取为:

List<Enrol_reg_principal_info> info = (List<Enrol_reg_principal_info>) q.list();

3
投票

当你说EmbeddedId时,它代表一个复合主键,它需要一个非null和唯一值。 JPA希望这些列非空且唯一。根据它选择你的列。

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

另外,我不确定你是否已经有吸气剂和二传手。嵌入式id类需要正确设置equals()hashcode()方法。

© www.soinside.com 2019 - 2024. All rights reserved.