Hibernate ORM值对象中的公共字段

Hibernate ORM值对象中的公共字段,hibernate,Hibernate,我有在所有域对象中可用的字段。这些领域是: Created_By Created_Date Modified_By Modified_Date 我可以声明/拥有包含这四个字段的CoreBusinessObject并将其扩展到另一个对象中吗?设计好吗?如果是这样的话,我怎么做ORM映射呢?是的,这是可能的,而且它的设计也很好 如果您使用的是Hibernate注解@MappedSuperclass,那么您需要的就是它。只需使用您注意到的4个字段创建一个抽象类,然后无论何时@实体拥有这4个字段,都从

我有在所有域对象中可用的字段。这些领域是:

Created_By
Created_Date
Modified_By
Modified_Date

我可以声明/拥有包含这四个字段的CoreBusinessObject并将其扩展到另一个对象中吗?设计好吗?如果是这样的话,我怎么做ORM映射呢?

是的,这是可能的,而且它的设计也很好

如果您使用的是Hibernate注解@MappedSuperclass,那么您需要的就是它。只需使用您注意到的4个字段创建一个抽象类,然后无论何时@实体拥有这4个字段,都从父抽象类继承


有关详细信息,请参阅的hibernate annotations文档。

是的,这是可能的,而且它的设计也很好

如果您使用的是Hibernate注解@MappedSuperclass,那么您需要的就是它。只需使用您注意到的4个字段创建一个抽象类,然后无论何时@实体拥有这4个字段,都从父抽象类继承


有关详细信息,请参阅位于的hibernate annotations文档。

我建议采用以下设计

首先,您需要一个LifeCycleInfo组件

LifeCycleInfo存储与持久模型实例的创建、上次修改、删除和存档时间相关的信息

<hibernate-mapping package="com.comp.model">
<class name="Employee" table="employee" lazy="false">
    <id name="id">
         <generator class="assigned"/>
    </id>

    <property name="email" type="string" column="email"/>

    <!-- Model lifecycle info attributes -->
    <component name="LifeCycleInfo" class="com.comp.component.LifeCycleInfo">
        <property name="createdDate" type="timestamp"  column="created_date"/>
        <property name="createdBy" type="string" column="created_by"/>
        <property name="lastModifiedDate" type="timestamp" column="last_modified_date"/>
        <property name="lastModifiedBy" type="string" column="last_modified_by"/>
        <property name="deletedBy" type="string" column="del_by"/>
        <property name="deletedDate" type="timestamp" column="del_date"/>
        <property name="archivedBy" type="string" column="arc_by"/>
        <property name="archivedDate" type="timestamp" column="arc_date"/>
    </component>
</class>
然后,您的持久化模型实现了可审计的

Employee implements Auditable
然后,您需要Hibernate拦截器

public class AuditableInterceptor extends EmptyInterceptor {

 public boolean onSave(Object entity, Serializable id, Object[] state,
                      String[] propertyNames, Type[] types) 
{
    if ( entity instanceof Auditable ) 
    {
        Date now = new Date();

        String userId = factory.getUserName(); /* get user Id from somewhere*/

        ((Auditable)entity).setCreatedDate(now);
        ((Auditable)entity).setCreatedBy(userId);

        return true;
     }
    return false;
}

/* rest of the implementation is trivial */
}

然后,注册您的可审核拦截器

Configuration cfg = new Configuration();
cfg.setInterceptor(new AuditableInterceptor());
.......
/* build SessionFactory */
你完了

编辑:

Employee.java

 ...............
  public Date getCreatedDate()
{
    return this.getLifeCycleInfo().getCreatedDate();
}

    public void setCreatedDate(Date createdDate)
{
    if (this.getLifeCycleInfo() == null)
        this.setLifeCycleInfo(new LifeCycleInfo());
    this.getLifeCycleInfo().setCreatedDate(createdDate);
} 
....................

我推荐以下设计

首先,您需要一个LifeCycleInfo组件

LifeCycleInfo存储与持久模型实例的创建、上次修改、删除和存档时间相关的信息

<hibernate-mapping package="com.comp.model">
<class name="Employee" table="employee" lazy="false">
    <id name="id">
         <generator class="assigned"/>
    </id>

    <property name="email" type="string" column="email"/>

    <!-- Model lifecycle info attributes -->
    <component name="LifeCycleInfo" class="com.comp.component.LifeCycleInfo">
        <property name="createdDate" type="timestamp"  column="created_date"/>
        <property name="createdBy" type="string" column="created_by"/>
        <property name="lastModifiedDate" type="timestamp" column="last_modified_date"/>
        <property name="lastModifiedBy" type="string" column="last_modified_by"/>
        <property name="deletedBy" type="string" column="del_by"/>
        <property name="deletedDate" type="timestamp" column="del_date"/>
        <property name="archivedBy" type="string" column="arc_by"/>
        <property name="archivedDate" type="timestamp" column="arc_date"/>
    </component>
</class>
然后,您的持久化模型实现了可审计的

Employee implements Auditable
然后,您需要Hibernate拦截器

public class AuditableInterceptor extends EmptyInterceptor {

 public boolean onSave(Object entity, Serializable id, Object[] state,
                      String[] propertyNames, Type[] types) 
{
    if ( entity instanceof Auditable ) 
    {
        Date now = new Date();

        String userId = factory.getUserName(); /* get user Id from somewhere*/

        ((Auditable)entity).setCreatedDate(now);
        ((Auditable)entity).setCreatedBy(userId);

        return true;
     }
    return false;
}

/* rest of the implementation is trivial */
}

然后,注册您的可审核拦截器

Configuration cfg = new Configuration();
cfg.setInterceptor(new AuditableInterceptor());
.......
/* build SessionFactory */
你完了

编辑:

Employee.java

 ...............
  public Date getCreatedDate()
{
    return this.getLifeCycleInfo().getCreatedDate();
}

    public void setCreatedDate(Date createdDate)
{
    if (this.getLifeCycleInfo() == null)
        this.setLifeCycleInfo(new LifeCycleInfo());
    this.getLifeCycleInfo().setCreatedDate(createdDate);
} 
....................

很抱歉我必须使用ORM映射。我该怎么做?对不起。我必须使用ORM映射。我该怎么做?对不起。我必须使用ORM映射。我该怎么做?ORM=对象关系映射。所以“ORM没有任何意义。也许你是指“xml映射”?对不起。我必须使用ORM映射。我该怎么做?ORM=对象关系映射。所以“ORM没有任何意义。”。也许你的意思是“xml映射”?