22

ジェネリックエンティティ、スーパークラス:

@MappedSuperclass
public abstract class GenericEntity {
    private Integer id;
    public Integer getId() {return id;}
    public void setId(Integer id) {this.id = id;}
}

ポジョ:

@Entity
@Table(name = "POJO_ONE")
@SequenceGenerator(name = "HB_SEQ_POJO_ONE", sequenceName = "SEQ_POJO_ONE", allocationSize = 1)
public class PojoOne extends GenericEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HB_SEQ_POJO_ONE")
    @Column(name = "ID")
    @AttributeOverride(name = "id", column = @Column(name = "ID"))
    private Integer id;

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

@ AttributeOverride、@ Id、...のアノテーションを使用しようとしましたが、機能しません。手伝って頂けますか?属性「id」をオーバーライドして、別の列名とシーケンスをpojo/tableで指定したいと思います。それを行うための最良の方法は何ですか?

4

2 に答える 2

31

代わりにこれを試してください

@MappedSuperclass
public abstract class GenericEntity {
    protected Integer id;
    ...

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


@Entity
@Table(name = "POJO_ONE")
@SequenceGenerator(name = "HB_SEQ_POJO_ONE", sequenceName = "SEQ_POJO_ONE", allocationSize = 1)
@AttributeOverride(name = "id", column = @Column(name = "ID"))
public class PojoOne extends GenericEntity {
    // we should not define id here again
    ...

    @Override
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HB_SEQ_POJO_ONE")
    public Integer getId() {return id;}
}
于 2011-03-10T10:05:32.200 に答える
4

idGenericEntityのに注釈を付けてみません@Idか?また、再定義するのではなく、フィールドではなくクラスにid配置する必要があります。@AttributeOverride(name = "id", column = @Column(name = "ID"))

編集:

これを基本クラスで使用しています(これpackage.OurTableGeneratorは独自の実装です)。

@GeneratedValue ( generator = "ourTableGenerator", strategy = GenerationType.TABLE )
@GenericGenerator ( name = "ourTableGenerator", strategy = "package.OurTableGenerator",
  parameters = { @Parameter ( name = OurTableGenerator.TABLE_PARAM, value = "t_sequence" ),
                 @Parameter ( name = OurTableGenerator.SEGMENT_COLUMN_PARAM, value = "c_entity" ),
                 @Parameter ( name = OurTableGenerator.VALUE_COLUMN_PARAM, value = "c_nextHi" ),
                 @Parameter ( name = OurTableGenerator.INCREMENT_SIZE_COLUMN_PARAM, value = "c_blocksize" ) } )
@Id
@Column(name = "c_uid")
private Long uid;

これでは、エンティティ/テーブルごとに差分ブロックサイズとシーケンスを指定しましょう。

独自のテーブルジェネレーターの場合、サブクラス化できますorg.hibernate.id.TableGenerator

于 2011-03-10T10:01:05.057 に答える