Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对Hibernate管理的POJO的Spring AOP建议_Hibernate_Spring_Domain Driven Design_Aspectj_Spring Aop - Fatal编程技术网

针对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属性的任何替代方法。有没有办法从目标类之外声明它?简要介绍了一种在不使用注释的情况下执行此操作的方法。我自己从来没有试过,但看起来很容易。