2013-10-07 2 views
0

검색을 시도했지만 원하는 것을 찾는 데 문제가있었습니다. 나는 다음과 같은 스키마이 권리는JPA CompositeKey를 사용하면 다른 엔티티의 속성을 사용합니다.

USER 
    *UserId 
    -Desc 
Registration 
    *DeviceId 
    *UserId 
    -date 

그래서 등록 등에 기본 키를 만들려면 ...

@Embeddable 
public class RegPk{ 
    private String deviceId; 
    private User user; 
    @Column(name="DEV_ID") 
    public String getDevId(){ 
     return deviceId; 
    } 
    ... 
    @ManyToOne 
    @JoinColumn(name="USER_ID", referencedColumnName="USER_ID") 
    public User getUser() { 
     return user; 
    } 
    ... 
} 

인가 (*은 기본 키를 나타냅니다)가? 유지할 때 USER_ID 필드를 올바르게 업데이트합니까? [: 37 : 07 : 동부 서머 타임 01시 56분 10/7/13 13] 000000ae 웹 애플리케이션 E의 com.ibm.ws. 나는 이런 종류의 일을하려고 할 때

나는 다음과 같은 ....

수 websertainer.webapp.WebApp logServletError SRVE0293E : [Servlet 오류] - [Hello] : org.apache.openjpa.util.MetaDataException : "class org.me.mfa.jpa.Registration"유형으로 지정된 id 클래스가 기본 클래스와 일치하지 않습니다. 클래스의 키 필드 ID 클래스가 pk 필드 유형을 포함하여 영구 유형과 동일한 기본 키를 갖고 있는지 확인하십시오. 일치하지 않는 속성 : '사용자'

이제 무엇을 할 수 있습니까?

+0

RegPk를 embeddedId 클래스로 사용하려는 것처럼 등록 엔터티를 표시하십시오. – Chris

답변

1

JPA는 기본 키 클래스가 기본 유형 만 관계를 포함하는 것을 허용하지 않습니다. JPA 2.0에서는 관계가 ID와 구분 될 수 있지만 관계를 엔티티 클래스로 옮기고 RegPk에 deviceId 및 UserId가 포함되도록합니다. 엔티티 내에서 @PKClass 또는 @EmbeddedId를 사용 하려는지에 따라 Device-User 관계가 @Id 또는 @MapsId ("user")로 표시됩니다. pk 클래스를 사용하는 예제는 http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers을 참조하십시오.

JPA 1.0에서는 Device-User 관계가 @PrimaryKeyJoinColumn 주석을 지정하거나 @JoinColumn을 insertable = false, updatable =로 표시하여 읽기 전용으로 표시된다는 점을 제외하고는 비슷한 설정을 사용합니다. 그릇된). 그러면 기본 키 기본 매핑 값을 수동으로 설정해야하며 참조 된 User 엔터티의 값을 직접 가져와야합니다. 물론 이것은 User의 id를 이미 할당해야합니다. 두 개체가 새로운 경우 추가 작업이 필요할 수 있습니다.

+0

저는 2.0을 사용하고 있는데 그게 정확히 제가 생각한 것입니다. 훌륭한 설명! – Jackie

0

User 엔티티에 대한 보존 조치를 전달하려면 cascade = CascadeType.ALL에서 @ManyToOne까지 주석을 추가합니다. 다른 오류가없는 경우

... 
    @ManyToOne(optional=true, cascade = CascadeType.ALL) 
    @JoinColumn(name="USER_ID", referencedColumnName="USER_ID") 
    public User getUser() { 
     return user; 
    } 
    ... 

글쎄, 그것은 일할 수 :처럼

그것은 볼 것이다. 나는 약간 optional=true과 혼동 스럽지만, deviceId,null으로 ID를 제공 할 수 있지만 그럴 수도 있습니다.

+0

예 옵션은 잘라 내기 및 붙여 넣기 오류 덕분에 조언을 주셔서 감사합니다 – Jackie

+0

내 업데이트로 결과를 다시 확인하십시오 – Jackie

관련 문제