Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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
Java 做一个;“交易行为”;内部阶级_Java_Spring_Hibernate_Transactions_Inner Classes - Fatal编程技术网

Java 做一个;“交易行为”;内部阶级

Java 做一个;“交易行为”;内部阶级,java,spring,hibernate,transactions,inner-classes,Java,Spring,Hibernate,Transactions,Inner Classes,我有一个Spring+Hibernate+MySQL web应用程序,目前它只是一个hello world测试区域 我的一个服务类实现了此方法: public List<Offerta> tutte() { List<Offerta> tutte = null; TransactionStatus status = txm.getTransaction( new DefaultTransactionDefinition() );

我有一个Spring+Hibernate+MySQL web应用程序,目前它只是一个hello world测试区域

我的一个服务类实现了此方法:

public List<Offerta> tutte() {
        List<Offerta> tutte = null;
        TransactionStatus status = txm.getTransaction( new DefaultTransactionDefinition() );
        try {
            tutte = dao.getAll(Offerta.class);
            txm.commit(status);
        } catch (Exception e) {
            e.printStackTrace();
            txm.rollback(status);
        }
        return tutte;
    }
但这是一个内部类:如何从中传入和传出数据?我的意思是,我怎样才能从那个交易中得到结果“l”列表?您可以用多种方法来回答这个特定的案例,但我需要的是一个通用的TransactionAction或一个不同的解决方案,它允许我编写实际的数据库代码,而不必每次都编写相同的无聊代码

请不要回答“为什么不使用@Transactional annotations或AOP tx:advice配置?”因为我不能!
为什么?我在谷歌AppEngine上,而那些酷家伙并不那么酷:对javax.naming包的访问被禁用,以及一些声明性事务的伟大方式触及了它-\

您可以使用代理对象模拟基本的AOP机制。比如

这是一个嘲弄。但我真的怀疑它是否能与Spring或GAE配合得很好。请注意,您需要为代理使用接口

interface Dao {
    List<Foo> getAllFoo();
}

public class MyDao implements Dao {

    public MyDao() {
    }

    public List<Foo> getAllFoo() {
        //.. get list of foo from database. No need to use transactions
    }

    public static void main(String[] args) {
        Dao dao = new MyDao();
        InvocationHandler handler = new TransactionProxyHandler(dao);
        Dao proxy = (Dao) Proxy.newProxyInstance(MyDao.class.getClassLoader(), MyDao.class.getInterfaces(), handler);
        List<Foo> all = proxy.getAllFoo();
    }
}


class TransactionProxyHandler implements InvocationHandler {

    protected Object delegate;
    PlatformTransactionManager txm = new PlatformTransactionManager();

    public TransactionProxyHandler(Object delegate) {
        this.delegate = delegate;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        TransactionStatus status = txm.getTransaction();
        Object res = null;
        try {
            res = method.invoke(delegate, args);
            txm.commit(status);
        } catch (Exception e) {
            e.printStackTrace();
            txm.rollback(status);
        }
        return res;
    }
}
接口Dao{
列出getAllFoo();
}
公共类MyDao实现了Dao{
公共MyDao(){
}
公共列表getAllFoo(){
//…从数据库获取foo列表。无需使用事务
}
公共静态void main(字符串[]args){
Dao=newmydao();
InvocationHandler=newTransactionProxyHandler(dao);
Dao proxy=(Dao)proxy.newProxyInstance(MyDao.class.getClassLoader(),MyDao.class.getInterfaces(),handler);
List all=proxy.getAllFoo();
}
}
类TransactionProxyHandler实现InvocationHandler{
受保护对象委托;
PlatformTransactionManager txm=新的PlatformTransactionManager();
公共事务ProxyHandler(对象委托){
this.delegate=委托;
}
公共对象调用(对象代理、方法、对象[]参数)
扔掉的{
TransactionStatus status=txm.getTransaction();
对象res=null;
试一试{
res=method.invoke(委托,参数);
提交(状态);
}捕获(例外e){
e、 printStackTrace();
txm.回滚(状态);
}
返回res;
}
}

很有趣,但是。。。。你能用一点伪代码来编辑你的答案吗?只是为了了解我的情况。
interface Dao {
    List<Foo> getAllFoo();
}

public class MyDao implements Dao {

    public MyDao() {
    }

    public List<Foo> getAllFoo() {
        //.. get list of foo from database. No need to use transactions
    }

    public static void main(String[] args) {
        Dao dao = new MyDao();
        InvocationHandler handler = new TransactionProxyHandler(dao);
        Dao proxy = (Dao) Proxy.newProxyInstance(MyDao.class.getClassLoader(), MyDao.class.getInterfaces(), handler);
        List<Foo> all = proxy.getAllFoo();
    }
}


class TransactionProxyHandler implements InvocationHandler {

    protected Object delegate;
    PlatformTransactionManager txm = new PlatformTransactionManager();

    public TransactionProxyHandler(Object delegate) {
        this.delegate = delegate;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        TransactionStatus status = txm.getTransaction();
        Object res = null;
        try {
            res = method.invoke(delegate, args);
            txm.commit(status);
        } catch (Exception e) {
            e.printStackTrace();
            txm.rollback(status);
        }
        return res;
    }
}