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: 同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられていました」というメッセージが表示されます。