1

Textと継承されたTextUserの2つのテーブルがあります。

テキストの内容: id、textType
TextUser の内容: id、ロケール、名前、タイトル

TextUser.idはText.idへの外部キーです。したがって、結合の例は次のようになります。

Text.id - Text.textType - TextUser.id - TextUser.locale - TextUser.name

100          1            100          en            name1
100          1            100          fr            name2
101          1            101          en            name3

したがって、キー 100 を使用すると、Text に 1 つのレコードがあり、TextUser には ID が同じでロケール (en、fr) が異なる 2 つのレコードがあります。

これはレガシー システムなので、構造を変更することはできません。今、休止状態で処理しようとしています。

@Entity(name = "Text")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Text {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "TextId")
    private Long id;

    @Column(name = "TextType")
    private Integer textType;

    @Entity
    @Table(name = "TextUser")
    @ForeignKey(name = "FK_TextUser_Text")
    public class TextUser extends Text {
    
        @Column(name = "locale")
        private String locale;
    
        @Column(name = "name")
        private String name;

したがって、1 つのロケールで完全に機能します。しかし、キー 100 で新しいロケールを挿入するにはどうすればよいでしょうか? Text に ID があり、hibernate はそれを外部キー TextUser.id に使用します。したがって、ID を明示的に設定してもロケールが異なる場合、「org.hibernate.NonUniqueObjectException: 同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられていました」というメッセージが表示されます。

4

2 に答える 2

1

継承の有効なケースではありません。

TextUser複合キー (複合キー ( idlocale) がありますよね?) および派生 ID を持つ多対 1 の関係としてモデル化する必要があります(複合キーにTextUserは外部キーが含まれるため)。

考えられるアプローチの 1 つが@MapsIdjavadocに示されています。

于 2012-07-31T11:47:03.710 に答える
0

親テーブルの ID が重複するため、これらのクラスを継承関係でマップすることはできません (これが現在発生しているエラーです)。

2 つのクラスを 1 対多の関係にマップする必要があります (これらは同じです)。Text クラスはそのまま残り (@Inheritance を除く)、UserText は UserText.id と UserText.locale の間の複合 ID を持ちます。

これらのテーブルを更新する必要がない場合は、両方のテーブル (Text.id - Text.textType - TextUser.locale - TextUser.name) を結合してビューを作成し、複合 ID: Text.id と TextUser を使用できます。 .locale.

于 2012-07-31T11:46:37.330 に答える