2

私は Hibernate Annotations を使用していますが、解決しようとしている問題は次のとおりです。

同じ列マッピングを持つが異なる識別子を持つ2つの異なる @Entity クラスが必要です。

最初のものは識別子として id を使用する必要があります。

2 番目は、名前を識別子として使用する必要があります。

したがって、id と名前を含むすべての列を持つ @MappedSuperclass で注釈が付けられた抽象クラスがあり、さらにスーパークラスを拡張し、id と名前のゲッターをオーバーライドする 2 つの @Entity クラスがあります。

@MappedSuperclass 
public class MappingBase {
    protected Integer id;
    protected String name;

    @Column (name = "ID")
     public void getId() {
          return this.id;
     }

    @Column (name = "NAME")
     public void getName() {
          return this.name;
     }              
}

@Entity
@Table (name = "TABLE")
public class Entity1 extends MappingBase {

  @Id
  @Column (name = "ID")
  public void getId() {
    return this.id;
  } 
}

@Entity
@Table (name = "TABLE")
public class Entity2 extends MappingBase {

  @Id
  @Column (name = "NAME")
  public void getName() {
      return this.name;
  } 
}

注: スーパー クラスにメンバー (id,name) が必要です。@Transient を id および name ゲッターに追加できることはわかっていますが、これは、各クラスに両方を追加する必要があり、適切な設計ではないことを意味します:( さらに、次の insertable="false, updateable=false が役立ちますしかし、これの意味がわかりません...

私を助けてください!

4

4 に答える 4

2

このサンプルを試して、

Hibernate – @MappedSuperclass 列識別子をオーバーライドする方法

于 2013-01-09T11:20:40.377 に答える
2

Hibernate/JPA を使用すると、プロパティまたはアクセサーに注釈を付けることができます。プロパティに注釈がある場合@Id、JPA はクラスのすべてのプロパティを検索します。同様に@id、getter メソッドに注釈がある場合、JPA はすべての getter を検索します。

代わりにプロパティに注釈を付けることで、上記の問題を解決できます。スーパークラスと 2 つのサブクラスは次のようになります。

@MappedSuperclass
public abstract class AbstractMappingBase {

    //properties other than id and name

    public abstract Integer getId();

    public abstract String getName();

    //other getters and setters

}

@Entity
public class Entity1 extends AbstractMappingBase {

    @Id
    private Integer id;

    private String name;

    @Override
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

@Entity
public class Entity2 extends AbstractMappingBase {

    private Integer id;

    @Id
    private String name;

    @Override
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

ここで、JPA は getter の代わりにプロパティを探します。スーパークラスとそのサブクラスの間に重複するプロパティはありません。それでうまくいきます。

于 2016-01-12T06:58:26.140 に答える
1

基本クラスを @Embeddable として定義し、@AttributeOverride を使用して実装クラスで @Embedded を使用する方がはるかに優れています。

于 2013-01-09T07:26:44.653 に答える