2011-10-05 103 views
1

我有父子关系,如以订单项目,这是我的域模型都这样表示:对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实体。

回答

2

您要找的是"Using AspectJ to dependency inject domain objects with Spring"。我有可用于github上的编织build-timeload-time的可执行示例。

+0

'支持旨在用于在任何容器控制之外创建的对象。域对象通常属于这一类,因为它们通常是使用新操作符以编程方式创建的,或者是由数据库查询产生的ORM工具。“ - 这就是它。我无法找到使用@Configurable属性的替代方法。有什么方法可以从目标类之外声明? –

+0

[“AspectJ的其他Spring方面”](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-ajlib-other)简要提到了一个没有注解就可以做到这一点。我从来没有尝试过,但看起来很简单。 –