문제

이와 같은 매핑을 가정하십시오

@Entity
public class User {

    private Integer id

    private List<Info> infoList;    

    @Id
    public getId() {
        return this.id;
    }

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="USER_ID", insertable=false, updateable=false, nullable=false)
    public getInfoList() {
        return this.infoList;
    }

    public void addQuestion(Info question) {
        info.setInfoCategory(InfoCategory.QUESTION);
        info.setInfoId(new InfoId(getId(), getInfoList().size()));

        getInfoList().add(question);
    }

    public void addAnswer(InfoRepository repository, Integer questionIndex, Info answer) {
        Info question = repository.getInfoById(new InfoId(getId(), questionIndex));

        if(question.getInfoCategory().equals(InfoCategory.ANSWER))
            throw new RuntimeException("Is not a question");

        if(question.getAnswer() != null)
            throw new RuntimeException("You can not post a new answer");

        answer.setInfoCategory(InfoCategory.ANSWER);
        answer.setInfoId(new InfoId(getId(), getInfoList().size()));

        getInfoList().add(answer);

        question.setAnswer(answer);
    }

}

정보 수업에 의해 매핑 된 질문과 답변

@Entity
public class Info implements Serializable {

    private InfoId infoId;

    private Info answer;

    private InfoCategory infoCategory;

    public Info() {}

    @Embeddable
    public static class InfoId {

        private Integer userId;
        private Integer index;

        public InfoId(Integer userId, Integer index) {
            this.userId = userId;
            this.index = index;
        }

        @Column("USER_ID", updateable=false, nullable=false)
        public getUserId() {
            return this.userId;
        } 

        @Column("INFO_INDEX", updateable=false, nullable=false)
        public getIndex() {
            return this.index;
        }

        // equals and hashcode

    }

    // mapped as a ManyToOne instead of @OneToOne
    @ManyToOne
    JoinColumns({
        JoinColumn(name="USER_ID", referencedColumnName="USER_ID", insertable=false, updateable=false),
        JoinColumn(name="ANSWER_INDEX", referencedColumnName="INFO_INDEX", insertable=false)
    })
    public Info getAnswer() {
        return this.answer;  
    }

    @EmbeddedId
    public InfoId getInfoId() {
        return this.infoId;
    }

}

GetAnswer에서는 OnetoOne 매핑과 관련된 일부 문제가 있기 때문에 OnetoOne 대신 MantoOne을 사용합니다. OnetoOne은 많은 토론으로 매핑 될 수 있습니다 (@joincolumn의 독특한 = true). Info_index는 특정 목적과 관련이 없습니다. 레거시 시스템에서 복합 기본 키를 지원하기위한 키입니다.

답변하기 전에 다음을 처리하십시오.

객체에 할당 된 식별자 또는 복합 키가있는 경우 Save ()를 호출하기 전에 식별자를 객체 인스턴스에 할당해야합니다.

그래서 나는지도를해야합니다 joincolumn (name = "user_id", referenceColumnName = "user_id", insertable = false, updateable = false) Hibernate가 두 개의 돌연변이 성 속성을 허용하지 않기 때문에 Getanswer에서 동일한 collumn을 공유하지 않기 때문에 (userID도 user_ID를 사용합니다) 그렇지 않으면 user_id가 삽입 가능한 = false, updateable = false로 맵핑되어야합니다.

이제 GetAnswer 매핑을 살펴보십시오

@ManyToOne
JoinColumns({
    JoinColumn(name="USER_ID", referencedColumnName="USER_ID", insertable=false, updateable=false),
    JoinColumn(name="ANSWER_INDEX", referencedColumnName="INFO_INDEX", insertable=false)
})

Hibernate는 다른 삽입 가능하고 업데이트 가능할 수 없다고 불평하기 때문에

통과하려면 어떻게해야합니까?

레거시 시스템임을 조심하십시오.

문안 인사,

도움이 되었습니까?

해결책 2

GetAnswer 매핑의 질문에 따르면

@ManyToOne
JoinColumns({
    JoinColumn(name="USER_ID", referencedColumnName="USER_ID", insertable=false, updateable=false),
    JoinColumn(name="ANSWER_INDEX", referencedColumnName="INFO_INDEX", insertable=false)
})

Hibernate는 다른 삽입 가능하고 업데이트 가능한 혼합을 허용하지 않기 때문에 불평합니다. user_id joincolumn에서 삽입 가능하고 업데이트 가능한 것을 확인하고 answer_index joincolumn에서만 삽입 할 수 있습니다.

그래서 그것을 통과시키기 위해 나는 answer_index joincollumn을 설정했습니다.

JoinColumn(name="ANSWER_INDEX", referencedColumnName="INFO_INDEX", insertable=false, updateable=false)

이런 식으로 최대 절전 모드는 불평하지 않을 것입니다.

그리고 나는 answindex라는 새로운 속성을 설정했습니다

private Integer answerIndex;   

@Column(name="ANSWER_INDEX", insertable=false)
public void getAnswerIndex() {
    return this.answerIndex;
}

그런 다음 사용자 AddAnswer에서

public void addAnswer(InfoRepository repository, Integer questionIndex, Info answer) {
    Info question = repository.getInfoById(new InfoId(getId(), questionIndex));

    if(question.getInfoCategory().equals(InfoCategory.ANSWER))
        throw new RuntimeException("Is not a question");

    if(question.getAnswer() != null)
        throw new RuntimeException("You can not post a new answer");

    answer.setInfoCategory(InfoCategory.ANSWER);
    answer.setInfoId(new InfoId(getId(), getInfoList().size()));

    getInfoList().add(answer);

    // Added in order to set up AnswerIndex property
    question.setAnswerIndex(answer.getInfoId().getIndex());
}

다른 팁

당신은 할 것입니다 크게 내장 ID를 포기하고 대리 PK를 대신 사용하여 매핑을 단순화하십시오.

사용해야하는 경우 InfoId.index 어떤 목적으로 (질문 / 답변을 주문하려면? list 매핑), 정기적 인 속성으로 유지하십시오.

UserId 대체됩니다 ManyToOne ~에 User; 다른 연관성 끝 (in User 클래스)는 다음과 같이 매핑됩니다 @OneToMany(mappedBy="User")

왜 답변이 그대로 매핑 되는가 ManyToOne? 그렇지 않아야합니다 OneToMany (예 : 많은 답변에 대한 질문 1)? 어느 쪽이든, 클래스 자체를 매핑하는 것은 이상적이지 않습니다. 기본적으로 비효율적 인 "인접력 목록"모델 계층 구조를 구현하고 있습니다. 또한 귀하의 경우에는 2 레벨 이하인지 확인해야합니다. 나는지도를한다 Question 그리고 Answer 별도의 클래스로서; 공통 인터페이스를 구현하거나 동일한베이스 (아마도 추상) 클래스를 확장 할 수 있습니다. 어느 쪽이든, 당신은 최대 절전 모드가 제공하는 암시 적 다형성을 즐길 수 있습니다.

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