1

拥有,

class RadicadoOficio {
    @ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="cor_radicado_localidad", joinColumns=@JoinColumn(name="ano_radicado"), @JoinColumn(name="num_radicado")}, inverseJoinColumns=@JoinColumn(name="interno_localidad")})
private List<Localidad> localidades;
}

class Localidad {// does not reference RadicadoOficio. unidirectional relationship }  

asume ano_radicado 是一个 int (ano 在某种程度上意味着年份),而 num 是一个字符串(实际上是一个可以包含字母的“数字”)

生成 sql: delete from cor_radicado_localidad where ano_radicado=2012 and num_radicado=AX33

这是好事。

但是,如果您在 RadicadoOficio 中更改 joinColumns 的顺序,即:

joinColumns=@JoinColumn(name="num_radicado"), @JoinColumn(name="ano_radicado")}, 

你得到:从 cor_radicado_localidad 中删除,其中 ano_radicado=AX33 和 num_radicado=2012

那很糟。

据我所知,映射中连接列的顺序应该无关紧要,并且在两种情况下生成的 SQL 应该是相同的。我错过了什么?tnx

4

1 回答 1

1

映射中连接列的顺序如果后跟referencedColumnName参数无关紧要。这意味着如果您隐式指定连接表中的哪一列引用其他表上的哪一列,您将不会有任何问题。

因此,请考虑按如下方式更改您的注释:

@JoinTable(name="cor_radicado_localidad", joinColumns={@JoinColumn(name="ano_radicado" ,referencedColumnName="ano_radicado" ), @JoinColumn(name="num_radicado",referencedColumnName="num_radicado")}, inverseJoinColumns=@JoinColumn(name="interno_localidad")})

您的第一个示例只是偶然运行良好。仅仅是因为ano_radicadonum_radicado列在Radicado表中的顺序相同。

Hibernate 不够聪明,无法区分列名及其在其他表中对应的引用列,换句话说,这实际上是不可能的,因为您可能在连接表中使用了一些不同的名称。看这个例子:

Table foo
firstId  :(int)
secondId :(int)

Table bar
firstId :(int)

Table foo_bar
foo_secondId :(int)
foo_firstId :(int)
bar_firstId :(int)
于 2013-01-25T17:32:48.163 回答