GithubHelp home page GithubHelp logo

spring data JPA 笔记 about blog HOT 3 OPEN

zxy16305 avatar zxy16305 commented on July 26, 2024
spring data JPA 笔记

from blog.

Comments (3)

zxy16305 avatar zxy16305 commented on July 26, 2024

实体类中建立一对多、一对一、多对多的关系

在实际的运用中,发现直接在实体类中写父id的话,会使得程序和orm过度耦合(当然带来的是速度的优势)。要使得程序的架构更加明朗,还是得使用hibernate原来那一套。

    //注意注解加到get方法上 一对一多对多也差不多的
    @OneToMany(mappedBy = "parentDept") //这里写持有者对应的属性名
    public Set<OrgMemberEntity> getChildMember() {
        return childMember;
    }

    @ManyToOne()
    @JoinColumn(name = "parent_id")
    @NotFound(action= NotFoundAction.IGNORE)
    @org.hibernate.annotations.ForeignKey(name="none") //据说不会生成外键,不过这是过时的方法
    public OrgDeptEntity getParentDept() {
        return parentDept;
    }

在换成hibernate注解的时候,有一些小问题,记录在这里。

  • 在数据库,有些不存在的父ID可能会写成0,此时匹配父类的的时候会报错。举个例子:
    @ManyToOne
    @JoinColumn(name="dept_id")
    @NotFound(action= NotFoundAction.IGNORE)
    @org.hibernate.annotations.ForeignKey(name="none")
    public OrgDeptEntity getParentDept() {
        return parentDept;
    }

加入 @NotFound 配置未找到的动作就可解决,默认就是报错
(我怀疑spring boot 的配置有解决方案..)

jpa实体类json化嵌套递归的解决方案

这里实在多的一方加上注解`@JsonIgnore`解决( ~~ 具体加在哪边我也不是很懂哈哈哈哈哈 ~~ )
这可能就是门槛吧,要知道怎么解决的甚至还得看源码

jpa的懒加载问题

在开了懒加载配置` @OneToMany(mappedBy = "parentDept",fetch = FetchType.LAZY)`的情况下,会在
查询结果生成代理对象,调用这个代理对象懒加载部分的get方法会报错(~~和我想的有点不一样啊啊~~)

解决的方法一就是关闭懒加载
解决方法二(update 18-3-17): 之前报错是因为session已经提交了(hibernate中的概念),而提交的
原因是因为,没有开启事务...所以在相关方法上加上`@Transactional`就好了。当调用get方法是会自动
查询数据库中的相关信息(好象是一开始只加载id,然后根据调用的方法再加载其他/全部数据)。

jpa update的解决方案

jpa似乎没有原生的update方案(不太确定),一般简单的方式就是先find,修改后save。
但在复杂的状态下代码就太冗余了。
这里是使用@Query注解写jpql语句完成的update操作
 @Modifying
 @Query("update OrgDeptEntity d set d.deptName = :#{#dept.deptName} 
                  where d.id= :#{#dept.id}")
 public int setByDept(@Param("dept") OrgDeptEntity orgDeptEntity);
@Modifying是写入数据库的注释,传入对象则采用@Param的方式,同时在jpql语句中使用 :#{#注解value} 的方式传入(文档上写的不是很明白,这莫非是jpql的用法)

(应该还有其他解决方案的 万能的jpa啊~)

insert or update 的解决方案

读了好几天的文档,查了好几天的资料,都没有比较好的解决方案。仔细一想,就算是mybatis也要发两条sql的,那么jpa先findone,然后再save。这好像也是比较标准的解决方案了。 😂

主键生成策略要指明

出现了一些奇怪的错误,在主键的get方法上加上了 @GeneratedValue(strategy = GenerationType.AUTO) 后解决了问题

关系映射保存的坑

  • 一直爆detached entity passed to persist的错误,网上给出的答案是不要手动设置id。但我的类的id本身就是null,但是第一个部门完好的保存了,结合这个现象,有一个猜想:
    在保存子对象时,再一次保存了父对象(此时的父对象是有id的)。然后把
    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    改成
    @ManyToOne
    问题解决。 (没错,hibernate或者说jpa出了问题你都不知道哪里出了问题的。。。)

from blog.

zxy16305 avatar zxy16305 commented on July 26, 2024

JPA审计 (JPA Auditing)

当数据写入数据库时,有些数据用程序去确定有些冗余,比如浏览次数、创建时间、修改时间。有些可以通过数据库触发器解决,而比如时间,当数据库所在的环境事件不标准时,会发生一些问题。
JPA提供了审计的功能,链接
例如审计时间的具体的做法时,在相关字段上添加@CreatedDate 、@LastModifiedDate等注解,在实体类上加@EntityListeners(AuditingEntityListener.class)注解。

对标准JPA Entity对象的检查

由于注解加在get方法上,实际检查的get后面的参数,即要求的是标准的getter/setter

from blog.

zxy16305 avatar zxy16305 commented on July 26, 2024

FAQ

  • 用persistent.xml生成的entity,却爆出字段名不存在的错误

    查看sql知,他把驼峰式的字段名解析成了下划线形式的字段名。这是hibernate的映射策略问题。

截图:
image

增加配置physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl (让IDE来自动补全吧2333)

  • hibernate_sequence' doesn't exist 的报错
    增加配置
    image

  • nullable的问题
    insert时如有空值,会遇到此类问题,可以在entity类上加上注解

@DynamicInsert
@DynamicUpdate

from blog.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.