Hibernate - OneToMany注释导致具有不匹配的左连接的选择查询

时间:2017-09-18 03:36:06

标签: java hibernate

我在表1 - 表2之间以及表2与表3之间存在一对多关系的三个表。

Table1具有两列复合主键 - Col_A& Col_B

  

表1

     

为col_a
  Col_B
  ....其他专栏

Tabl2具有复合主键,其中包含三列Col_A,Col_B和Col_C。 Col_A& Col_B值来自Table1,但在数据库模式中没有定义外键关系(这是一个旧的遗留数据库......由于数据问题,我现在无法添加约束)

  

表2

     

为col_a
  Col_B
  Col_C
  ---其他专栏

Table3具有四列复合主键。同样,表2和表3之间没有外键关系。

  

表3

     

Col_A

     

Col_B

     

Col_C

     

Col_D

     

----其他专栏

我已经按照以下方式定义了我的域对象映射。

ClassOne{

    @Id
    @EmbeddedId
    private TableOneId id;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "classOne")  
    private Set<ClassTwo> classTwoList = new HashSet<ClassTwo>(0); 

}

 TableOneId{
     //I've omitted the column name annotations for simplicity
      private String colA;
      private String colB;
}

ClassTwo{

    @Id
    @EmbeddedId
    private TableTwoId id;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "classTwo")  
    private Set<ClassThree> classTwoList = new HashSet<ClassThree>(0); 

    @ManyToOne
    @JoinColumns({
       @JoinColumn(name="COL_A",insertable=false, updatable=false),
       @JoinColumn(name="COL_B",insertable=false, updatable=false) 
    })
    private ClassOne classOne;
}

 TableTwoId{
      private String colA;
      private String colB;
      private String colC;
}


ClassThree{

    @Id
    @EmbeddedId
    private TableThreeId id;

    @ManyToOne
    @JoinColumns({
       @JoinColumn(name="COL_A",insertable=false, updatable=false),
       @JoinColumn(name="COL_B",insertable=false, updatable=false) ,
       @JoinColumn(name="COL_C",insertable=false, updatable=false)
    })
    private ClassTwo classTwo;
}

 TableThreeId{
      private String colA;
      private String colB;
      private String colC;
      private String colD;
}

使用上面的映射配置,插入到三个表中的工作正常。当我调用session.save(classOne)时,我可以看到记录被插入到所有三个表中。

但是当我从DB检索ClassOne时,生成的选择SQL已经使用不正确的列保持连接..

ClassOne classOne = (ClassOne )session.get(ClassOne .class, id);
  

从表1中选择**** t1左边连接t2col_a = t2.col_a上的表2 t2   和t1.col_b = t2.col_b在t2.col_a = t3.col_a和t上连接Table3 t3    t2.col_b = t3.col_c t2.col_c = t3.col_b

如上所示,t2和t3之间的左连接错误的列关联..我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案..

我在JoinColumn中添加了referenceColumn属性,问题已经消失。我可以看到Hibernate SQL具有左连接的正确关联。

ClassTwo{

    @Id
    @EmbeddedId
    private TableTwoId id;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "classTwo")  
    private Set<ClassThree> classTwoList = new HashSet<ClassThree>(0); 

    @ManyToOne
    @JoinColumns({
       @JoinColumn(name="COL_A",insertable=false, updatable=false, referencedColumnName="COL_A"),
       @JoinColumn(name="COL_B",insertable=false, updatable=false,referencedColumnName="COL_B") 
    })
    private ClassOne classOne;
}


ClassThree{

    @Id
    @EmbeddedId
    private TableThreeId id;

    @ManyToOne
    @JoinColumns({
       @JoinColumn(name="COL_A",insertable=false, updatable=false, referencedColumnName="COL_A"),
       @JoinColumn(name="COL_B",insertable=false, updatable=false, referencedColumnName="COL_B") ,
       @JoinColumn(name="COL_C",insertable=false, updatable=false, referencedColumnName="COL_C")
    })
    private ClassTwo classTwo;
}

现在生成的SQL看起来像

  

从表1中选择**** t1左边连接t2col_a = t2.col_a上的表2 t2   和t1.col_b = t2.col_b在t2.col_a = t3.col_a和t上连接Table3 t3   t2.col_b = t3.col_b和t2.col_c = t3.col_c