EntityNotFoundException в спящем режиме Многие из них сопоставляют, однако данные существуют
Я получаю ошибку javax.persistence.EntityNotFoundException, когда пытаюсь получить объект User via Invoice
invoice.getUser(). GetId()
Ошибка выглядит следующим образом
javax.persistence.EntityNotFoundException: Unable to find com.indianretailshop.domain.User with id 5
at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:137)
at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:189)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:178)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
Сущности классов следующие (геттеры и сеттеры не включены)
@Entity
@Table(name="users")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique=true, nullable=false)
private int id;
.
.
.
//bi-directional many-to-one association to Invoice
@OneToMany(mappedBy="user")
private List<Invoice> invoices;
}
@Entity
@Table(name="invoice")
public class Invoice implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique=true, nullable=false)
private int id;
.
.
.
//bi-directional many-to-one association to User
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="Users_id")
private User user;
}
Ответы
Ответ 1
Проблема может заключаться в том, что прямой объект не существует, но также может быть и то, что ссылка на объект из этого объекта, как правило, для типа выборки EAGER, или необязательный = false.
Попробуй это:
//bi-directional many-to-one association to User
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="Users_id")
private User user = new User();
Ответ 2
У меня была та же проблема, и
@NotFound(action = NotFoundAction.IGNORE)
решил мою проблему.
Ответ 3
Если вы используете @ManyToOne, указанный объект должен существовать. Единственный другой вариант - указать это поле как длинное и получить ссылочный объект с помощью отдельного запроса.
Выдает исключение (javax.persistence.EntityNotFoundException) вместо того, чтобы возвращать null, если он не может найти запрошенный объект.
Используйте аннотацию @NotFound для устранения этого исключения, если вы ленивы загружаетесь и не обрабатываете это исключение вручную.
@ManyToOne(
fetch = FetchType.LAZY)
@NotFound(
action = NotFoundAction.IGNORE)
@JoinColumn(
name = COLUMN,
referencedColumnName = COLUMN,
insertable = false,
updatable = false)
private Table table;
Ответ 4
У меня была аналогичная проблема в последнее время, но проблема в том, что запись всегда существует в БД. Поэтому я провел некоторое расследование, выяснилось, что в какой-то момент кэшированная сущность помечена как удаление и перезагрузка с ошибкой перед перезагрузкой из БД. Это случилось в Hibernate 4.3.5
Final для меня
Затем я обновляюсь до Hibernate 4.3.11
Final, который, похоже, исправляет проблему.
Ответ 5
Не уверен, что это относится к вашему делу.
Но у меня была аналогичная проблема, когда я обновлялся непосредственно в таблице базы данных X и устанавливал поле null, но в классе java это поле было @NotNull.
Итак, когда другой класс Y имел объект X с ManyToOne, он не смог загрузить объект из-за нулевого значения в сущности.
Ответ 6
пожалуйста попробуйте следующее
@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.ALL)
или
@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.MERGE)
Ответ 7
Используйте @NotFound (action = NotFoundAction.IGNORE), если его родитель не существует
Используя cascade = CascadeType.ALL, он удалит родительский объект