我有父子关系,如以订单项目,这是我的域模型都这样表示:对Hibernate Spring AOP的咨询管理POJO
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;
}
}
我坚持这些实体与Hibernate ,使用这样的映射:
<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>
这现在工作非常好。要在一个Spring控制器方法添加订单项目,以订单,例如,我可以做一个简单的清洁方法:
Order order = orderRepository.findById(orderId);
OrderItem item = new OrderItem();
order.add(item);
完成。我甚至在我的Bean定义文件中设置了OpenSessionInViewInterceptor,所以只要控制器方法完成,订单项就会持久化。
问题是我想立即致电item.getId()
,但是当order.add(item)
方法返回时,事务尚未提交,并返回零。最好的做法似乎是建立一个交易服务的方法,而我却这样说:
Order order = orderRepository.findById(orderId);
OrderItem item = new OrderItem();
orderService.addItem(order, item)
现在item.getId()
返回生成的ID的时候了。
我遇到的问题是orderService.addItem
方法除了在事务中包装order.add(item)
方法以外没有其他用途。我想知道我可以如何摆脱它。
我的问题是,我怎么可能使order.add(item)
方法事务?
我看到它的唯一的方式,orderRepository使用Hibernate的会话交互必须返回的Spring AOP还是AspectJ代理,其add(item)
方法我可以声明为我的bean定义文件中的事务。
我将如何能够返回这样的Spring托管代理订单?我可以通过重写Hibernate的Interceptor.onLoad
方法来实现吗?
是否有任何其他方式使订单(具体实现)与Spring Transaction Advisor关联?
我知道我实现的服务可能是最实用的解决方案,但我很想知道如何将AOP建议附加到Hibernate持久化的POJO实体。
'支持旨在用于在任何容器控制之外创建的对象。域对象通常属于这一类,因为它们通常是使用新操作符以编程方式创建的,或者是由数据库查询产生的ORM工具。“ - 这就是它。我无法找到使用@Configurable属性的替代方法。有什么方法可以从目标类之外声明? –
[“AspectJ的其他Spring方面”](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-ajlib-other)简要提到了一个没有注解就可以做到这一点。我从来没有尝试过,但看起来很简单。 –