2010-06-21 2 views
1

У меня есть поля, доступные во всех объектах домена. Эти поля являются:Общие поля в объектах значения ORM объекта Hibernate

Created_By 
Created_Date 
Modified_By 
Modified_Date 

Могу ли я объявить/у CoreBusinessObject, который содержит эти четыре поля и распространить это на другой объект? Это хороший дизайн? Если да, то как я могу сделать сопоставление ORM?

+0

К сожалению. Я должен использовать отображение ORM. Как мне это сделать? – Jothi

+0

ORM = Реляционное сопоставление объектов. Итак, «ORM ничего не значит. Возможно, вы имеете в виду« xml mapping »? – Bozho

ответ

1

Я рекомендую следующие конструкции ....

Во-первых, вам нужен компонент 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> 

Тогда вам нужен интерфейс маркера сказать, подвергаемый аудит

public interface Auditable { 
    Date getCreatedDate(); 
void setCreatedDate (Date crt_date); 

String getCreatedBy(); 
void setCreatedBy (String user_id); 

    /* rest of the methods for getting/setting lastModifiedDate/By etc. */ 

} 

Тогда ваша Persistent модель реализует подвергаемого аудит

Employee implements Auditable 

Затем вам нужна гибернация перехватчик ...

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 */ 

Вы Done!

  • SE

EDIT:

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); 
} 
.................... 
0

Да, это возможно и его также хороший дизайн.

Если вы используете аннотации Hibernate @MappedSuperclass - это то, что вы ищете. Просто создайте абстрактный класс с 4 полями, которые вы отметили, и в любое время, когда @Entity имеет эти 4 поля, наследуйте от родительского абстрактного класса.

Для получения дополнительной информации вы можете просмотреть документацию аннотации спящего режима по номеру http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e1168.

+0

Извините, мне нужно использовать сопоставление ORM. Как это сделать? – Jothi

Смежные вопросы