• JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用


    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常

    问题类:一对多、一对一、多对多
    ============一对多
    一方的设置
        @OneToMany(mappedBy="ask",cascade={CascadeType.REMOVE})
        @LazyCollection(LazyCollectionOption.FALSE)
        @OrderBy(value="id desc")
        public Set<ScAskAnswer> getAnswers() {
            return answers;
        }
    多方的设置
        @ManyToOne(fetch=FetchType.EAGER)
        @JoinColumn(name="ASK_ID")
        public ScAsk getAsk() {
            return ask;
        }
    ===========一对一
    一方
        @OneToOne(cascade={CascadeType.REMOVE,CascadeType.PERSIST,CascadeType.MERGE})
        @JoinColumn(name="TEXT_ID")
        public ScText getText() {
            return text;
        }
    另一方没有单独的设置
    =============
    
    仿照案例分析二
    USER类——下面每一组的上半部分代码都是user用户类的
    ====================第一组
    一方
        @OneToMany(fetch=FetchType.LAZY,cascade = { CascadeType.REMOVE }, mappedBy="cmsUser")
        public List<CmsMsgInfo> getCmsInfos() {
            return cmsInfos;
        }
    多方
        @ManyToOne
        @JoinColumn( name = "userId" )
        private User cmsUser;
    
    说明:网上搜索资料:如果是EAGER,那么表示取出这条数据时,它关联的数据也同时取出放入内存中 ;如果是LAZY,那么取出这条数据时,它关联的数据并不取出来。
    在jpa中jpa默认的加载方式是lazy方式也就是在实际使用到数据的时候才加 载相关数据,使用lazy时可以不用显示注明fetch=FetchType.LAZY
    ====================第二组 一方 @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "user") @JsonIgnore @OrderBy("roleIndex") public List<UserRole> getUserRoles() { return userRoles; } 多方 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "f_user_id", nullable = false) public User getUser() { return this.user; } ====================第三组 一方 @OneToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL },mappedBy="user") public CmsUserCompany getCmsUserCompany() { return cmsUserCompany; } 一方 @MapsId @OneToOne @JoinColumn(name="userid") public User getUser() { return user; } ====================第四组 @ManyToMany @JoinTable( name="cms_domain_user" , joinColumns={ @JoinColumn(name="userid") } , inverseJoinColumns={ @JoinColumn(name="id") } ) public List<CmsDomain> getCmsDomains() { return cmsDomains; } @ManyToMany(mappedBy="cmsDomains") @JsonIgnore private List<User> cmsUsers; ====================第五组 @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "user") @JsonIgnore @OrderBy("groupIndex") public List<UserMemberGroup> getUserGroups() { return userGroups; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "f_user_id", nullable = false) public User getUser() { return user; } ====================第六组 @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name="cms_user_project_relation" , joinColumns={ @JoinColumn(name="userid") } , inverseJoinColumns={ @JoinColumn(name="projectid") } ) public List<CmsProject> getCmsProjects() { return cmsProjects; } @ManyToMany( mappedBy = "cmsProjects" ) public List<User> getUser() { return user; } ====================第七组 @OneToMany(mappedBy="user",cascade = CascadeType.ALL,orphanRemoval = true) @JsonIgnore public List<CmsUserProjectRelation> getCmsUserProjectRelations() { return cmsUserProjectRelations; } @ManyToOne @JoinColumn(name="userid",insertable = false, updatable = false) private User user; 网上资料: 当使用JPA配置实体时,如果有两个属性(一个是一般属性,一个是多对一的属性)映射到数据库的同一列,就会报错。 这时,在多对一的@JoinColumn注解中添加insertable = false, updatable = false就能解决。 1. /** 2. * 用户类 3. */ 4. @Entity 5. @Table(name = "TBL_SYS_USER") 6. public class SysUser{ 7. @Id 8. @GeneratedValue(generator = "system-uuid") 9. @GenericGenerator(name = "system-uuid", strategy = "uuid") 10. @Column(name = "USER_ID", unique = true, length = 40) 11. @CsvColumn(imported=false) 12. private String id; //用户ID 13. 14. @Column(name = "USER_CODE", nullable = false, length = 40) 15. private String userCode; //用户账号 16. 17. @CsvColumn(desc="用户姓名", required= true ) 18. @Column(name = "USER_NAME", length = 60) 19. private String userName; //用户姓名 20. 21. @Column(name = "DEPT_ID", length = 40) 22. private String deptId; //部门ID(IS_ORG=0的) 23. 24. @ManyToOne 25. @JoinColumn(name = "DEPT_ID", insertable = false, updatable = false, nullable=true) 26. private SysOrg dept; //部门对象 27. 28. } 我们可以看到,deptId和dept都映射到数据库里面的DEPT_ID字段,但是加上了insertable = false, updatable = false后,在保存数据时,dept不会被保存到数据库。
  • 相关阅读:
    【mysql中文乱码】-解决方式
    【URL带参跳转乱码】-解决方式
    【IP地址租约到期】-解决方式
    【Vue-入门笔记-5】
    【Vue-入门笔记-4】
    输入框中的空"",0,null的判断
    让页面以黑白页面显示
    select设置text的值选中(兼容ios和Android)基于jquery
    js中关于两个变量的比较
    css3 动画 总结
  • 原文地址:https://www.cnblogs.com/dixinyunpan/p/5998061.html
Copyright © 2020-2023  润新知