我这边有个User 表,还有个avatar表,avatar里面有个字段为userId,我现在要做one to one 的影射,在查询user 的时候把avatar 查询出来.但是avatar里面不能包含user对象,我要转化成json

解决方案 »

  1.   

    在User实体里面的getAvatar()方法上面加 @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY),Avatar不做关联就可以实现一对一单向关联
      

  2.   

    楼主的意思不就是要单向关联吗。在User中的getAvatar()上加
    @OneToOne
    @JoinColumn(name="User实体中的主键",referencedColumnName="userId")
      

  3.   

    这样的话我的理解就是说user表中要有avatar这个字段,你这个是加在avatar还是user中的
      

  4.   

    user中不需要avatar的关联字段啊。因为你avatar表中已经有外间了。用的是你user的主键和avatar的外建进行关联。
    @JoinColumn里面的name就是你当前表的主键,referencedColumnName用的就是你avatar表中的userId
    这完全不矛盾
      

  5.   

    我按照你的做了,它会自动更新user表,添加上一个avatar字段,但是在写unit test的时候查询出来的avatar为null.
      

  6.   


    private Integer id;
        private String username;
        private String email;
        private String password;
        private Integer joinStamp;
        private Integer activityStamp;
        private String accountType;
        private boolean emailVerify;
        private Integer joinIp;
        private Avatar avatar;
        @OneToOne
        @JoinColumn(name="id",referencedColumnName="userId")
        public Avatar getAvatar() {
            return avatar;
        }
      

  7.   

    private Integer id;
        private Integer hash;
        private Integer userId;    @Column(name = "`userId`")
        public Integer getUserId() {
            return userId;
        }
      

  8.   

    这个从代码上已经没有问题了。你hibernate的关联策略会不会把大写改为_+小写
      

  9.   

    如果怕关联错误的话,你就用“伪级联”,即:user 里边含有一个avatarID,但不设置任何关联,然后在前台转换为DTO对象(包含User的所有属性以及Avatar的所有属性),这样虽然步骤多了点,但是永远不会错。
      

  10.   

    我们项目经理基本上不用外键,清一色的都是伪级联,而且很少让实体类直接参与前台展示,一律用DTO对象,这样可以从根本上避免JSON的死循环。
      

  11.   

    我也是这么做的啊,只是我想在查询的时候把avatar查询出来,再去封装dto对象!
      

  12.   

    查询的时候查询只出ID,再去根据ID查询,然后再封装成DTO对象。是这样的吗?
      

  13.   

    不是,用级联查询直接查出avatar对象,然后再去转换成dto