针对Hibernate管理的POJO的Spring AOP建议
我有一个父子关系,如订单到订单项目,我在域模型中表示为:针对Hibernate管理的POJO的Spring AOP建议,hibernate,spring,domain-driven-design,aspectj,spring-aop,Hibernate,Spring,Domain Driven Design,Aspectj,Spring Aop,我有一个父子关系,如订单到订单项目,我在域模型中表示为: public class Order { private int id; private Set<OrderItem> orderItems = new HashSet<OrderItem>(); public int getId() { return id; } public void add(OrderItem orderItem) {
public class Order {
private int id;
private Set<OrderItem> orderItems = new HashSet<OrderItem>();
public int getId() {
return id;
}
public void add(OrderItem orderItem) {
orderItems.add(orderItem);
}
}
public class OrderItem {
private int id;
public int getId() {
return id;
}
}
<class name="Order" table="ORDERS">
<id name="id" column="ORDER_ID" access="field">
<generator class="native" />
</id>
<set name="orderItems" table="ORDERS_TO_ITEMS" access="field" cascade="all">
<key column="ORDER_ID" />
<many-to-many class="OrderItem" unique="true" column="ITEM_ID" />
</set>
</class>
<class name="OrderItem" table="ORDER_ITEMS">
<id name="id" column="ITEM_ID" access="field">
<generator class="native" />
</id>
</class>
Order order = orderRepository.findById(orderId);
OrderItem item = new OrderItem();
orderService.addItem(order, item)
完成了。我甚至在Bean定义文件中设置了OpenSessionInViewInterceptor,这样一旦控制器方法完成,订单项就会被持久化
问题是我想立即调用item.getId()
,但是当order.add(item)
方法返回时,事务尚未提交,返回零。最佳实践似乎是创建事务服务方法,我是这样做的:
public class Order {
private int id;
private Set<OrderItem> orderItems = new HashSet<OrderItem>();
public int getId() {
return id;
}
public void add(OrderItem orderItem) {
orderItems.add(orderItem);
}
}
public class OrderItem {
private int id;
public int getId() {
return id;
}
}
<class name="Order" table="ORDERS">
<id name="id" column="ORDER_ID" access="field">
<generator class="native" />
</id>
<set name="orderItems" table="ORDERS_TO_ITEMS" access="field" cascade="all">
<key column="ORDER_ID" />
<many-to-many class="OrderItem" unique="true" column="ITEM_ID" />
</set>
</class>
<class name="OrderItem" table="ORDER_ITEMS">
<id name="id" column="ITEM_ID" access="field">
<generator class="native" />
</id>
</class>
Order order = orderRepository.findById(orderId);
OrderItem item = new OrderItem();
orderService.addItem(order, item)
现在item.getId()
立即返回生成的ID
我遇到的问题是orderService.addItem
方法除了在事务中包装order.add(item)
方法之外没有其他用途。我想知道我怎样才能摆脱它
我的问题是,我如何才能使订单.add(item)
方法具有事务性?
在我看来,与Hibernate会话交互的orderRepository必须返回Spring AOP或AspectJ代理,我可以在Bean定义文件中将其add(item)
方法声明为事务性的
我如何才能返回这样一个Spring管理的代理订单?我可以通过重写Hibernate的拦截器.onLoad
方法来实现吗
有没有其他方法使订单(一个具体的实现)与Spring事务顾问相关联
我知道我实现的服务可能是最实用的解决方案,但我真的很想知道如何将AOP建议附加到Hibernate持久化POJO实体。您正在寻找的是。我在github上提供了和编织的可执行示例。
该支持旨在用于在任何容器控制之外创建的对象。域对象通常属于这一类,因为它们通常是使用new操作符以编程方式创建的,或者是由ORM工具作为数据库查询的结果创建的。
--正是这样。我找不到使用@Configurable属性的任何替代方法。有没有办法从目标类之外声明它?简要介绍了一种在不使用注释的情况下执行此操作的方法。我自己从来没有试过,但看起来很容易。