рдЬрдм рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рд╣рдм рдкрд░ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдореИрдВ рд▓рдЧрднрдЧ рдПрдХ рдкреНрдпрд╛рд░реЗ рд╕рд╛рд▓ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ
рдкрдж рдкрд╛ рд╕рдХрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдСрдбрд┐рдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ AnObject рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде
рдПрдХ рдбреЗрдореЛ рд╕реНрдЯреИрдВрдб
рдмрдирд╛рдПрдВ , рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ DAO рдкрд░рддред
рдХреЛрдбрдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдХреЛрдб рдХреЗ рдХреЗрд╡рд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреБрдХрдбрд╝реЗ рд▓рд╛рддрд╛ рд╣реВрдВ - рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрдк рдЬреАрдердм рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
@Entity @Table(name = "user") public class User { @Id @GeneratedValue private long id; @Basic @Column(name = "username", updatable = false, unique = true, nullable = false) private String username;
@Entity @Table(name = "anObject") public class AnObject { @Id @GeneratedValue private long id; @Column private String value;
AnObject рдЗрдХрд╛рдИ рдореЗрдВ рджреЛ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛
рдЬреЛрдбрд╝реЗрдВ - рдЕрдВрддрд┐рдо рд╕рдВрдкрд╛рджрди рдФрд░ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓реЗрдЦрдХ рдХреА рддрд┐рдерд┐:
рдХреЛрдб @Embeddable public class LastModified { @Column @Temporal(TemporalType.TIMESTAMP) private Calendar lastUpdated; @OneToOne @JoinColumn(name = "lastEditor_id") private User lastEditor;
public interface LastModifiable { LastModified getLastModified(); void setLastModified(LastModified modified); }
@Entity @Table(name = "anObject") public class AnObject implements LastModifiable { @Id @GeneratedValue private long id; @Column private String value; @Embedded private LastModified lastModified;
рдФрд░ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рд╛
рд╡рд░реНрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
рдЕрдм рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рдореЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рддрд╛рд░реАрдЦ / рд▓реЗрдЦрдХ рдкрд░ рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ... рд╣рдо "рдЖрд▓рд╕реА" рд▓реЛрдЧ рд╣реИрдВ, рддреЛ рдЖрдЗрдП рдЗрд╕ рдХрд╛рдо рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ - рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣рд░ рдЬрдЧрд╣ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЛ рд╕реЗрд╡ рдпрд╛ рдЕрдкрдбреЗрдЯ (
рдХрдорд┐рдЯ ) рдИрд╡реЗрдВрдЯ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ:
рдХреЛрдб @Component public class LastModifiedListener extends DefaultSaveOrUpdateEventListener { private transient static final Logger LOG = LoggerFactory.getLogger(LastModifiedListener.class.getName()); @Autowired private UserDao userDao; @Override public void onSaveOrUpdate(SaveOrUpdateEvent event) { LOG.trace("object: {}", event.getObject()); if (event.getObject() instanceof LastModifiable) { LastModified lastModified = new LastModified((User) userDao.get(2)); ((LastModifiable) event.getObject()).setLastModified(lastModified); LOG.trace("object: {}", event.getObject()); } super.onSaveOrUpdate(event); } }
@Component public class HibernateEventWiring { @Autowired private SessionFactory sessionFactory; @Autowired private LastModifiedListener lastModifiedListener; @PostConstruct public void registerListeners() { EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService( EventListenerRegistry.class); registry.getEventListenerGroup(EventType.SAVE_UPDATE).prependListener(lastModifiedListener); } }
рдЕрдм
рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдмрдирд╛ рд╣реБрдЖ рд╣реИ - рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рд╡реЗ рдирдП рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╢реНрд░реЛрддрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВ)
рдпрд╣ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - LastModifiable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП, рд╣рд░ рдмрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдФрд░ LastEditor рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
UPD: рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдереЛрдбрд╝реА рд╕рдордЭрджрд╛рд░реА рдереА - рд╕реБрдирдирд╛ рдХреЗрд╡рд▓ SaveOrUpdate рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдерд╛, рдЬрдмрдХрд┐ рдХреЗрд╡рд▓ рд╕реЗрд╡ рдФрд░ рд╕рд┐рд░реНрдл рдЕрдкрдбреЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред
рдЕрджреНрдпрддрди рдкрд░реАрдХреНрд╖рдг
UPD: рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╕реНрд░реЛрдд - рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA (рдХреЗрд╡рд▓ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рд╢реНрд░реЛрддрд╛
org.springframework.data.jpa.domain.support.AuditingEntityListener
рдиреЗ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдореЗрдВ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛