20

Hibernate エンティティの共通基本クラス、つまり ID、バージョン、その他の共通プロパティを持つ MappedSuperclass はありますか? 欠点はありますか?

例:

@MappedSuperclass()
public class BaseEntity {

    private Long id;
    private Long version;
    ...

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {return id;}

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

    @Version
    public Long getVersion() {return version;}
    ...

    // Common properties
    @Temporal(TemporalType.TIMESTAMP)
    public Date creationDate() {return creationDate;}
    ...
}

@Entity
public class Customer extends BaseEntity {
    private String customerName;
    ...
}
4

5 に答える 5

5

これは私たちにとってはうまくいきます。IDと作成日だけでなく、変更日もあります。また、Stack Overflowの質問のように、Webアプリケーションのエンティティの一部にタグがあるため、 Taggableインターフェイスを実装する中間のTaggedBaseEntityもあります。

于 2008-10-01T10:20:56.607 に答える
5

私が主に使用するのは、hashCode() と equals() の実装です。また、エンティティをきれいに印刷するメソッドも追加しました。上記の DR に対応して、これのほとんどをオーバーライドできますが、私の実装では、Long 型の ID に固執しています。

public abstract class BaseEntity implements Serializable {

    public abstract Long getId();
    public abstract void setId(Long id);

    /**
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        return result;
    }

    /**
     * @see java.lang.Object#equals(Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        BaseEntity other = (BaseEntity) obj;
        if (getId() == null) {
            if (other.getId() != null)
                return false;
        } else if (!getId().equals(other.getId()))
            return false;
        return true;
    }

    /**
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return new StringBuilder(getClass().getSimpleName()).append(":").append(getId()).toString();
    }

    /**
     * Prints complete information by calling all public getters on the entity.
     */
    public String print() {

        final String EQUALS = "=";
        final String DELIMITER = ", ";
        final String ENTITY_FORMAT = "(id={0})";

        StringBuffer sb = new StringBuffer("{");

        PropertyDescriptor[] properties = PropertyUtils.getPropertyDescriptors(this);
        PropertyDescriptor property = null;
        int i = 0;
        while ( i < properties.length) {

            property = properties[i];
            sb.append(property.getName());
            sb.append(EQUALS);

            try {
                Object value = PropertyUtils.getProperty(this, property.getName());
                if (value instanceof BaseEntity) {
                    BaseEntity entityValue = (BaseEntity) value;
                    String objectValueString = MessageFormat.format(ENTITY_FORMAT, entityValue.getId());
                    sb.append(objectValueString);
                } else {
                    sb.append(value);
                }
            } catch (IllegalAccessException e) {
                // do nothing
            } catch (InvocationTargetException e) {
                // do nothing
            } catch (NoSuchMethodException e) {
                // do nothing
            }

            i++;
            if (i < properties.length) {
                sb.append(DELIMITER);
            }
        }

        sb.append("}");

        return sb.toString();
    }
}
于 2009-01-05T23:45:20.970 に答える
1

共通の基本クラスを使用することを躊躇しません。それが O/R マッピングのポイントだからです。

共通の基本クラスも使用しますが、エンティティが少なくともいくつかの共通のプロパティを共有している場合に限ります。ID が唯一の共通プロパティである場合は、使用しません。今まで、何の問題もありませんでした。

于 2009-01-04T10:57:36.540 に答える
0

それは私にとってもうまくいきます。

このエンティティでは、必要に応じてHibernate Enversのようなイベントリスナー/インターセプターを追加することもできます。これにより、次のことが可能になります。-すべての変更を追跡する-最後の変更を行ったユーザーを確認する-最後の変更を自動的に更新する-最初の挿入日を自動的に設定し、そのようなもの...

于 2011-12-15T19:12:35.007 に答える
-1

ここにいくつかのサンプルがあります

http://blogsprajeesh.blogspot.com/2010/01/nhibernate-defining-mappings-part-4.html

于 2010-01-14T16:34:02.760 に答える