с использованием Hibernate, JPA, Wildfly 11 и EJB, JTA. Моя база данных - это Mysql и внедрение entityManager с @PersistenceContext.
Я пытаюсь получить запись из базы данных, пока она существует в db, и ее тип в моем объекте - Long, а в db - BigInt (20).
entityManager.find(peristenceClass.class, 1L)
возвращает null, в то время как тот же запрос с:
entityManager.createQuery(select a from Entity a where a.id = 1).getResultList()
возвращает сущность.
После получения его методом createQuery (...) метод find () тоже его возвращает!
это определение моего класса сущности:
@Entity
@Table(name = "answersheet")
public class AnswerSheet implements DomainEntity {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "date", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date date;
@Column(name = "name")
private String name;
@Column(name = "national_code")
private String nationalCode;
@Column(name = "mobile")
private String mobile;
@Column(name = "client_ip", nullable = false)
private String clientIp;
@Column(name = "satisfaction")
private Integer satisfaction;
@JoinColumn(name = "questionnaire", referencedColumnName = "id", nullable = false)
@ManyToOne
private Questionnaire questionnaire;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNationalCode() {
return nationalCode;
}
public void setNationalCode(String nationalCode) {
this.nationalCode = nationalCode;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getClientIp() {
return clientIp;
}
public void setClientIp(String clientIp) {
this.clientIp = clientIp;
}
public Integer getSatisfaction() {
return satisfaction;
}
public void setSatisfaction(Integer satisfaction) {
this.satisfaction = satisfaction;
}
public Questionnaire getQuestionnaire() {
return questionnaire;
}
public void setQuestionnaire(Questionnaire questionnaire) {
this.questionnaire = questionnaire;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof AnswerSheet)) return false;
AnswerSheet that = (AnswerSheet) o;
return getId() != null ? getId().equals(that.getId()) : that.getId() == null;
}
@Override
public int hashCode() {
return getId() != null ? getId().hashCode() : 0;
}
@Override
public String toString() {
return "AnswerSheet{" +
"id = " + id +
'}';
}
@SteveC: да, чувак. Я обновил вопрос и добавил определение класса сущности.
Можете ли вы изменить тип данных id на Integer и попробовать. И вы уверены, что передаете правильный класс сущности в своем методе поиска, потому что здесь я вижу разницу
@GarimaGupta: извините, я не могу изменить свой тип идентификатора, потому что это повлияет на очень много кодов проекта. также о передаче правильного объекта, да, я передаю правильный. различия здесь из-за краткости. Я добавил определение объекта после комментария Стива. Я упоминал, что я получаю правильный результат с помощью createQuery (...). GetResultList (), и после его вызова метод find () тоже исправляет это! Я предполагаю, что это проблема с кешем или что-то в этом роде из спящего режима.
Я думаю, нам нужно увидеть весь код этого первоначального вызова find. Это фундаментальная операция JPA, и я был бы очень удивлен, если бы она не сработала, иначе было бы намного больше криков.
@HamidAdldoost: для работы entityManager.find (peristenceClass.class, 1L) класс / объект должен быть управляемым объектом этого менеджера объектов. Итак, если вы не покажете код, который вы используете для выполнения find () и createquery (), невозможно ответить, что идет не так.
Может, какое-либо из полей случайно помечено как нулевое значение nullable = false? У меня была аналогичная проблема в прошлом, и это было причиной.





Можете ли вы добавить свой класс entity-компонента к вопросу, включая все аннотации класса и те, которые указаны в объявлении первичного ключа?