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を生成します:ano_radicado=2012およびnum_radicado=AX33であるcor_radicado_localidadから削除します

それは良いことです。

ただし、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")})

あなたの最初の例は、事故によってのみ正常に動作していました。単純に、 Radicadoテーブルでano_radicadonum_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 に答える