weLive spring data 的使用过程中出现的问题,以及解决方式
数据库使用的sqlserver
首先我们这里有manyToOne 和oneToMany,oneToOne三种表与表之间的映射方式
1.@ManyToOne(fetch = FetchType.LAZY, targetEntity = LessonInfo.class)
@JoinColumn(name = "versionId", referencedColumnName = "CurrentVersionId")
private LessonInfo lessonInfo;
这里LessonInfo是一的一方,joinColumn 是两张表相互映射的字段映射的字段,versionId是本表,CurrentVersionId 是另外一个表,这里我们需要注意如果我们使用了本表的versionId字段与对方进行映射,本类本来生成的versionId字段属性需要删除。
2. @OneToMany(fetch = FetchType.LAZY, targetEntity = LessonVersionVocabulary.class,
mappedBy = "lessonVocabulary")
private List<LessonVersionVocabulary> lessonVersionVocabularys;
这里是一对多的映射,这里targetEntity对应是映射的多的一方的类,mappedBy维护的是本表
3.oneToOne
这个维护于WeliveSession表
@OneToOne(fetch = FetchType.LAZY, targetEntity = WeLiveUser.class)
@JoinColumn(name = "UserGuid", referencedColumnName = "UserGuid")
private WeLiveUser weLiveUser;
oneToOne只需要在一方进行维护即可,这里考虑一下哪一个类的属性是你需要手动填充,被动填充的表的数据,可以建立一个weliveUserSessionParam(参数类,来进行参数的接受,接受只够进行拆分赋值即可)
4,这是一个大坑,因为使用的是sqlsever数据库,我们使用了JPA TOOLS(eclipse自带的工具)生产的实体类 他自动生成实体时会在主键上加上生成策略,然而对于sqlsever的uniqueidentifier这个属性的数据时会出现错误,error content:String类型无法转换为uniqueidentifier,解决方式:去掉主键生成策略即可
5,又一个大坑,因为spring data jpa 递归查询数据,所以在转换为json数据时容易出现错误
在我们递归查询完数据时,在转换json时候就不需要查询了
解决方式:在实体上添加这个属性
@JsonIgnoreProperties(value = { "lessonVersionVocabularys", "isDeleted", "isEnabled", "handler",
"hibernateLazyInitializer" })
JPA的大坑基本就上面这么多,后面如果还有大坑,还会继续添加坑的说明,希望不要在有坑了,呵呵哒, NMD
6.如果在保存数据的时候保存对象时,对象中有ID 会进行查询和更新操作,而不是保存操作
也就是在编辑的时候可能会把你要insert的对象的id也传送过来了,导致了你下面的操作就是查询,更新而不是去新增一条数据
,解决办法就是设置id为空就可以去新增数据了进行insert操作
homeworkQuestionAnswerParam.setId(null);
HomeworkQuestionAnswer homeworkQuestionAnswer = new HomeworkQuestionAnswer();
homeworkQuestionAnswer.setLessonHomework(lessonHomework1);
PropertyUtils.copyProperties(homeworkQuestionAnswer,
homeworkQuestionAnswerParam);
homeworkQuestionAnswer.setCreateTime(new Timestamp(System.currentTimeMillis()));
homeworkQuestionAnswer.setCorrect(homeworkQuestionAnswerParam
.getIsCorrect());
HomeworkQuestionAnswer homeworkQuestionAnswer1 = homeworkQuestionAnswerDao.save(
homeworkQuestionAnswer);