programing

최대 절전 모드 매핑의 EntityNotFoundException이 있지만 데이터가 있음

sourcejob 2023. 8. 12. 10:14
반응형

최대 절전 모드 매핑의 EntityNotFoundException이 있지만 데이터가 있음

javax.persistence를 받고 있습니다.Invoice 개체를 통해 사용자를 가져오려고 할 때 EntityNotFoundException 오류가 발생했습니다.

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;
}

저도 같은 문제를 겪었고,

@NotFound(action = NotFoundAction.IGNORE)

내 문제를 해결했습니다.

@ManyToOne을 사용하는 경우 참조된 엔티티가 있어야 합니다.다른 유일한 옵션은 해당 필드를 길이로 지정하고 별도의 쿼리를 통해 참조된 엔티티를 검색하는 것입니다.

예외(javax.persistence)를 슬로우합니다.요청한 엔티티를 찾을 수 없는 경우 null을 반환하는 대신 EntityNotFoundException).

로드가 느리고 이 예외를 수동으로 처리하지 않는 경우 @NotFound 주석을 사용하여 이 예외를 해결합니다.

 @ManyToOne(
        fetch = FetchType.LAZY)
    @NotFound(
        action = NotFoundAction.IGNORE)
    @JoinColumn(
        name = COLUMN,
        referencedColumnName = COLUMN,
        insertable = false,
        updatable = false)
    private Table table;

문제는 직접 엔터티가 존재하지 않는 것일 수도 있지만 일반적으로 EARGER fetch 유형에 대해 해당 엔터티에서 참조된 엔터티이거나 선택 사항=false일 수도 있습니다.

사용해 보십시오.

     //bi-directional many-to-one association to User
     @ManyToOne(fetch=FetchType.LAZY)
     @JoinColumn(name="Users_id")
     private User user = new User();

그것이 당신의 경우에 적용되는지 확실하지 않습니다.

그러나 데이터베이스 테이블 X에서 직접 업데이트하고 필드 null을 설정했지만 Java 클래스에서는 필드가 @NotNull이었습니다.

따라서 다른 클래스 Y에 ManyToOne이 있는 X 개체가 있을 때 엔티티의 null 값 때문에 엔티티를 로드할 수 없습니다.

다음을 시도해 보십시오.

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.ALL)또는

@OneToMany(mappedBy="yourMappingattributeName",cascade=CascadeType.MERGE)

저도 최근에 비슷한 문제가 있었는데, DB에는 항상 기록이 존재한다는 것이 문제입니다.그래서 조사를 해보니 캐시된 엔티티가 제거로 표시되어 있고 DB에서 다시 로드하기 전에 다시 로드하지 못했습니다.에서 일어난 일입니다.Hibernate 4.3.5Final for me 다음으로 업그레이드합니다.Hibernate 4.3.11최종적으로 문제를 해결하는 것 같습니다.

@NotFound(액션 = NotFoundAction)를 사용합니다.무시) 부모가 없는 경우

cascade=CascadeType을 사용합니다.모든 항목이 상위 엔티티를 삭제합니다.

아마도 다음과 같은 대답을 듣고 유용하다고 생각하는 사람이 있을 것입니다.제 경우, 제 엔티티를 삭제로 표시했는데 이 엔티티와 관계가 있는 엔티티는 찾을 수 없습니다.그래서, 삭제된 것을 거짓으로 바꾸는 것이 저에게 효과가 있었습니다.

추가할 때 작동합니다.referencedColumnName = COLUMN@JoinColumns@ManyToOne주석

모든 엔티티에 대해 hashCode 및 equals 메서드를 구현해야 합니다.예:

@Override
public int hashCode() {
    return Objects.hash(getId());
}

이제 추가할 수 있습니다.optional = true에▁@ManyToOne 및 주석및nullable = true에▁@JoinColumn예외를 무시할 필요는 없습니다.이 질문이 처음 게시된 이후로 JPA가 약간 개선된 것 같습니다.

@ManyToOne(optional = true)
@JoinColumn(name = "user_id", referencedColumnName = "id", nullable = true)

언급URL : https://stackoverflow.com/questions/13539050/entitynotfoundexception-in-hibernate-many-to-one-mapping-however-data-exist

반응형