JPA, Hibernate: композитный ключ с ассоциациями. Почему загрузка, а не сохранение? - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь отобразить 3 объекта: Question, Answer и QuestionDisplayRule.Вопрос имеет много Ответов и много Вопросов-правил воспроизведения, каждый из которых принадлежит одному Вопросу.QuestionDisplayRule имеет один вопрос, один ответ и одно поле со строковым значением.Таблица БД для QuestionDisplayRule выглядит следующим образом:

create table question_display_rule(
    question_id int, 
    answer_id int, 
    answer_value varchar(128)
);

Естественно, question_id и answer_id - это PK.

Отображение JPA выглядит так:1009 *

@Entity
@Table(name = "question_display_rule")
public class QuestionDisplayRule implements Serializable {

    @EmbeddedId
    private QuestionDisplayRulePK id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="question_id", insertable = false, updatable = false)
    private Question question;

    @ManyToOne
    @JoinColumn(name = "answer_id", insertable = false, updatable = false)
    private Answer answer;

    @Column(name="answer_value")
    private String answerValue;

}

Проблема в том, что он прекрасно загружает QuestionDisplayRules, если я добавляю записи вручную в БД, но не сохраняю их.Нет ошибок, нет ничего ..

Тестовый код:

    QuestionDisplayRulePK qPK = new QuestionDisplayRulePK();
    qPK.setQuestion(q);
    qPK.setAnswer(a);

    QuestionDisplayRule qr = new QuestionDisplayRule(qPK, "Yes");
    qr.setAnswerValue("whateva..");

    ....
    // DAO code looks like: getSession().saveOrUpdate(qr);

Есть идеи?Спасибо!

1 Ответ

1 голос
/ 07 июня 2012

Вы отображаете сущности в встраиваемых объектах, это неправильно.Встраиваемый объект должен содержать только базовые типы.Короче говоря, ваши сущности должны выглядеть так:

@Entity
public class Question
{
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;
    @OneToMany(mappedBy = "question")
    private Set<Answer> answers;
}

@Entity
public class Answer
{
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;

    @ManyToOne
    private Question question;
}

@Entity
public class QuestionDisplayRule
{
    @EmbeddedId
    private QuestionDisplayRulePK key;

    @MapsId(value = "questionId")
    @ManyToOne
    @JoinColumn(name = "question_id", referencedColumnName = "id")
    private Question question;

    @MapsId(value = "answerId")
    @ManyToOne
    @JoinColumn(name = "answer_id", referencedColumnName = "id")
    private Answer answer;
}

@Embeddable
public class QuestionDisplayRulePK
{
    @Column(name = "answer_id")
    private Long answerId;
    @Column(name = "question_id")
    private Long questionId;
}
...