문제

내가 오히려 이상한 경우에 Java EE6 을 사용하는 JPA entitymanager 를 s find 방법과 함께 기업의 기본 id null 을 반환합니다,그러나 기준을 사용하여 API 를 선택하려면 모든 요소와 해당 id 를 잘 작동합니다.

여기에는 코드를 사용하는 find:

// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);

...그리고 여기에 코드를 사용 기준 API:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> u = criteria.from(User.class);
TypedQuery<User> query = em.createQuery(
    criteria.select(u).where(builder.equal(u.get("id"), userId)));
user = query.getSingleResult();

왜 어떤 아이디어 find null 을 반환합니다 하지만 조건을 찾은 사용자가?나 이러한 두 가지 다른 방법에 동일한 장소에서 프로그램입니다.

여기에 관련 부분을 사용자의 엔티티:

@Entity
@Table(name = "USERS")
@Access(AccessType.PROPERTY)
public class User implements Serializable {
    ...
    private Long id;
    ...
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_generator")
    @SequenceGenerator(name = "user_id_generator", sequenceName = "user_sequence", allocationSize = 1)
    @Column(name="id")
    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    ...
}
도움이 되었습니까?

해결책

문제를 알아 냈습니다.데이터베이스의 필드가 null가 허용되지 않아야합니다.이것은 나에게 그것을 편집했기 때문입니다.그 필드에 값을 추가 한 후에 문제가 사라졌습니다.

다른 팁

어떤 공급자를 사용하고 있습니까?

여기 에서이 찾기를 어디에서 실행하고 있습니까?찾기 전에 셋을 씻어 내고 제거하고 있습니까?

공급자로 EclipseLink를 사용하고 내 유사한 모델을 사용하면이 작업을 재현 할 수 없습니다.

공급자가 SQL을 기록 할 수 있다고 가정하고 찾기에서 DB로가는 SQL을 볼 수 있습니까?SQL은 어떻게 생겼고 SQL Plus 등에서 제대로 실행됩니까?

솔루션을 확인합니다.나에게 똑같은 일이 일어났습니다.NOT NULL로 collumns가 있었고, 내 앱의 테스트 중에 두 개의 collumns (외부 키)에 대한 데이터베이스의 제한을 전환했지만 엔티티 클래스에서 optional = false 관계의 (@ManyToOne) 속성을 변경하지는 않습니다.속성을 삭제 한 후 모델이 데이터베이스와 일치하여 모든 것이 잘 작동하기 시작했습니다. 환경이 어떤 종류의 예외를 일으키지 않는 환경이 이상한 것입니다.

고 있는지 다시 한 번 확인을 통과 Long 다음 코드:

// Always returns null, even for records I know for sure are in there.
user = em.find(User.class, userId);

이 방법으로 해결되지 않으면,활성화 SQL 로깅하면 무슨 일이 일어나고 있는지 확인하고 비교하는 동작이다.

하나의 이유는 "ID"필드가 사용자 엔티티의 ID로 올바르게 표시되지 않을 수 있습니다.

Sanity Check가 코드를 실행하기 전에 코드를 실행하기 전에 시간을내어 데이터베이스에 대한 수동 쿼리를 실행하여 적절한 사용자 레코드가 예상되는 ID와 함께 있도록하십시오.

데이터베이스에 없으면 엔티티 관리자가 플러시되었거나 현재 트랜잭션이 커밋되었는지 확인하십시오.

예를 들어, Hibernate를 공급자로 사용하는 경우 캐시에서 개체가 "지속됨"이 가능하고 변경 사항이 실제로 데이터베이스에 실제로 푸시되지 않았을 수 있습니다.따라서 Hibernate의 구현을 통과하는 기준은 객체를 검색하지만 엔티티 관리자가 객체를 찾을 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top