Hibernate Jpa:存储由实体组成的值对象集合 @实体 课堂提问{ @身份证 私有int-id; 私有字符串文本; @独身癖 设置回答选项; } 类应答选项{ 私有字符串选项; @许多酮 私人问题; } 表列: 问题:id,文本 回答选项:问题编号,选项 例子: 问题:你来自哪个县? 可能的答案:肯特,埃塞克斯,米德尔塞克斯,其他 预期api用途: 问题q=新问题(“你来自哪个县?”); q、 添加应答选项(新应答选项(“肯特”)) q、 添加应答选项(新应答选项(“Essex”)) q、 添加应答选项(新应答选项(“米德尔塞克斯”)) q、 添加应答选项(新应答选项(“其他”)) 保存(q); 我不需要回答选项的标识符,因为我认为应答选项是一个值对象。由于我不确定AnswerOption类使用的注释,有人能推荐如何使用JPA持久化这个模型吗
谢谢。我想说的是,把你的Hibernate Jpa:存储由实体组成的值对象集合 @实体 课堂提问{ @身份证 私有int-id; 私有字符串文本; @独身癖 设置回答选项; } 类应答选项{ 私有字符串选项; @许多酮 私人问题; } 表列: 问题:id,文本 回答选项:问题编号,选项 例子: 问题:你来自哪个县? 可能的答案:肯特,埃塞克斯,米德尔塞克斯,其他 预期api用途: 问题q=新问题(“你来自哪个县?”); q、 添加应答选项(新应答选项(“肯特”)) q、 添加应答选项(新应答选项(“Essex”)) q、 添加应答选项(新应答选项(“米德尔塞克斯”)) q、 添加应答选项(新应答选项(“其他”)) 保存(q); 我不需要回答选项的标识符,因为我认为应答选项是一个值对象。由于我不确定AnswerOption类使用的注释,有人能推荐如何使用JPA持久化这个模型吗,hibernate,jpa,orm,Hibernate,Jpa,Orm,谢谢。我想说的是,把你的答案选项类也作为实体 @Entity class Question{ @Id private int id; private String questionText; @OneToMany Set<AnswerOption> answerOptions; } class AnswerOption{ private String option; @ManyToOne private Quest
答案选项
类也作为实体
@Entity
class Question{
@Id
private int id;
private String questionText;
@OneToMany
Set<AnswerOption> answerOptions;
}
class AnswerOption{
private String option;
@ManyToOne
private Question question;
}
table-columns:
Question: id, text
AnswerOption: question_id, option
example:
Question: Which county are you from?
Possible answers: Kent, Essex, Middlesex, Others
Intended api usage:
Question q = new Question("Which county are you from?");
q.addAnswerOption(new AnswerOption("Kent"))
q.addAnswerOption(new AnswerOption("Essex"))
q.addAnswerOption(new AnswerOption("Middlesex"))
q.addAnswerOption(new AnswerOption("Others"))
questionDao.save(q);
将Question
类中的oneToMany
映射更改为使用CASCADE
选项,如下所示:
@Entity
class AnswerOption{
private String option;
@ManyToOne
private Question question;
}
@Entity
class Question{
@Id
private int id;
private String questionText;
@OneToMany(cascade = CascadeType.ALL, mappedBy="question")
Set<AnswerOption> answerOptions;
}
//get your hibernate session
Session session = ....
Question q = new Question("Which county are you from?");
q.addAnswerOption(new AnswerOption("Kent"))
q.addAnswerOption(new AnswerOption("Essex"))
q.addAnswerOption(new AnswerOption("Middlesex"))
q.addAnswerOption(new AnswerOption("Others"))
//use session to save the Question with AnswerOptionss
session.save(q);
确保您的addAnswerOption
方法位于Question
中,如下所示:
@Entity
class AnswerOption{
private String option;
@ManyToOne
private Question question;
}
@Entity
class Question{
@Id
private int id;
private String questionText;
@OneToMany(cascade = CascadeType.ALL, mappedBy="question")
Set<AnswerOption> answerOptions;
}
//get your hibernate session
Session session = ....
Question q = new Question("Which county are you from?");
q.addAnswerOption(new AnswerOption("Kent"))
q.addAnswerOption(new AnswerOption("Essex"))
q.addAnswerOption(new AnswerOption("Middlesex"))
q.addAnswerOption(new AnswerOption("Others"))
//use session to save the Question with AnswerOptionss
session.save(q);
如果您已经有了OO模型,那么您就有了它的持久性(JPA的目的是使工作自动化)。现在,真正的问题是什么?正如您所看到的,我没有用相关的JPA注释标记AnswerOption类,因为我不确定如何用JPA存储值对象。我相信您的解决方案会起作用。但我认为AnswerOption不应该成为一个实体。这也必然与问题的生命周期有关。谢谢回复。我想,
AnswerOption
也是一个包含question\u id
和option
列的表格。为什么你认为它不应该是一个实体?如果您注意到,在处理示例中,您只处理问题
,即会话。保存(问题)
和回答选项
由内部处理。同样,您可以仅使用question
执行update
,delete
,retrieve
。这是一个简单的父子场景,其中question
是父表,AnswerOption
是子表。众所周知,没有父母,孩子就无法生存。这也可以通过在AnswerOtption
表中的question\u id
上定义foreign key
,并在question
表中定义id
列来实现。存在父子关系。但子对象是一个不需要标识()的值对象。如果我没有使用hibernate来保存这个模型,我可以很容易地在没有id列的情况下保留AnswerOption?如果将AnswerOtption
映射为子实体,则可以单独管理AnswerOtption
或管理AnswerOtption
以及Question
假设id
在AnswerOtption
中为空。