小编Spu*_*ick的帖子

JEE7:EJB和CDI bean是否支持容器管理的事务?

Java EE7由一堆"bean"定义组成:

  • Managed Beans 1.0(JSR-316/JSR-250)
  • Java 1.0的依赖注入(JSR-330)
  • CDI 1.1(JSR-346)
  • JSF Managed Beans 2.2(JSR-344)
  • EJB 3.2(JSR-345)

为了摆脱我心中的混乱,我研究了几篇"何时使用哪种豆类"的文章.EJB的一个优点似乎是它们单独支持声明性容器管理事务(着名的事务注释).不过,我不确定这是否正确.任何人都可以批准这个吗?

同时,我想出了一个简单的演示应用程序来检查这是否真的如此.我刚刚根据这个片段定义了一个CDI bean(不是 EJB - 它没有类级别注释),如下所示:

public class CdiBean {
    @Resource
    TransactionSynchronizationRegistry tsr;

    @Transactional(Transactional.TxType.REQUIRED)
    public boolean isTransactional() {
        return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,GlassFish 4.0的结果是这个方法实际上返回true,根据我的询问,它没有按预期工作.我确实希望容器忽略CDI bean方法上的@Transactional注释,或者甚至抛出异常.我使用新安装的GlassFish 4服务器,因此没有干扰.

所以我的问题是:

  • 哪些bean类型实际上支持容器管理的事务?
  • 只是为了好奇,如果上面的代码错误,我怎么能用一个简单的演示应用程序来测试呢?

(顺便说一句:有人在这里描述了类似的问题,但其解决方案并不适用于我的情况.

java ejb jta java-ee cdi

19
推荐指数
2
解决办法
2万
查看次数

带有JTA的JPA:持久化实体并合并级联子实体

我与以下实体类具有双向一对多关系:

0或1个客户< - > 0个或更多产品订单

当持久化客户端实体时,我也希望持久化相关的产品订单实体(因为它们的"父"客户端的外键可能已被更新).

当然,所有必需的CASCADE选项都在客户端设置.但是,如果在引用现有产品订单时第一次持久保留新创建的客户端,则不起作用,如下所示:

  1. 产品订单"1"已创建并保留.工作良好.
  2. 创建客户'2'并将产品订单'1'添加到其产品订单列表中.然后它坚持下去.不行.

我尝试了几个apporaches,但没有一个显示预期的结果.请参阅下面的结果.我在这里阅读了所有相关问题,但他们没有帮助我.我在GlassFish 3.1.2上的Apache Derby(JavaDB)内存数据库中使用EclipseLink 2.3.0,纯JPA 2.0 Annotations和JTA作为事务类型.实体关系由JSF GUI管理.对象级关系管理工作(除了持久),我用JUnit测试测试它.

方法1)"默认"(基于NetBeans类模板)

客户:

@Entity
public class Client implements Serializable, ParentEntity {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy = "client", cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH},
            fetch= FetchType.LAZY)
    private List<ProductOrder> orders = new ArrayList<>();

    // other fields, getters and setters
}
Run Code Online (Sandbox Code Playgroud)

ProductOrder:

@Entity
public class ProductOrder implements Serializable, ChildEntity {
    private static final long serialVersionUID = 1L;

    @Id …
Run Code Online (Sandbox Code Playgroud)

java entity-relationship jpa jta jpa-2.0

18
推荐指数
2
解决办法
4万
查看次数

Mysema Querydsl:没有JPAQuery#list()方法

Mysema Querydsl使用的一些在线示例依赖于该JPAQuery#list()方法,例如,此stackoverflow答案包含GROUP BY/COUNT聚合示例.在官方文件中也提到了它.

但是,我没有在JPAQuery课堂上看到这种方法.它没有出现在IDE的自动完成中,并且它不存在于Maven下载的JAR文件中.

我已将这些依赖项添加到我的Maven项目中:

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>4.0.4</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <version>4.0.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

为什么这种JPAQuery#list()方法不存在?

maven querydsl

7
推荐指数
1
解决办法
2732
查看次数

Groovy编译时AST转换:分配给字段

我目前正在尝试实现一些Groovy编译时AST转换,但我遇到了麻烦:

如何为字段的赋值语句指定AST转换?即AST转换应转换以下代码:

class MyClass {
    @MyTransformation
    String myField

    public void init() {
    }
}
Run Code Online (Sandbox Code Playgroud)

变成类似的东西

class MyClass {
    String myField

    public void init() {
        this.myField = "initialized!"
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了这个AST构建器调用:

def ast = new AstBuilder().buildFromSpec {
        expression{
            declaration {
                variable "myField"
                token "="
                constant "initialized!"
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

但是在声明类的"init"方法中插入结果语句后,它会插入一个变量赋值,如

java.lang.Object myField = "initialized!"
Run Code Online (Sandbox Code Playgroud)

我查看了Ast Builder TestCase中包含的示例,但它们仅涵盖了类体中的字段声明,而不是字段的赋值.我自己尝试使用fieldNodeall会导致编译错误.我将编译阶段设置为INSTRUCTION_SELECTION; 我认为这应该没问题.

我该如何实现这一目标?基于该AstBuilder#buildFromSpec方法的解决方案是优选的,但是任何帮助都将受到高度赞赏.

groovy abstract-syntax-tree

5
推荐指数
1
解决办法
796
查看次数

Knex.js:创建表并插入数据

鉴于我有一个像这样的Knex.js脚本:

exports.up = function(knex, Promise) {
    return knex.schema.createTable('persons', function(table) {
        table.increments('id').primary();
        table.string('name').notNullable();
    });
};
Run Code Online (Sandbox Code Playgroud)

目前创建一个表.

如何将后续插入语句添加到此脚本?

我想要做的是添加像这样(或类似)的行:

knex.insert({id: 1, name: 'Test'}).into('persons')
Run Code Online (Sandbox Code Playgroud)

我不确定我理解这种基于承诺的方法是如何工作的.我应该用insert语句编写另一个脚本吗?或者我可以以某种方式将它们附加到我现有的脚本中吗?

不幸的是,我在Knex.js文档中找不到任何完整的create + insert示例.

node.js knex.js

5
推荐指数
2
解决办法
2万
查看次数

一对多关系:使用JPA 2.0更新删除的子项

我有一个双向的一对多关系.

0或1 客户 < - > 0个或更多产品订单的列表.

应该在两个实体上设置或取消设置该关系:在客户端,我想设置分配给客户端的产品订单列表; 然后应该将客户端设置/取消设置为自动选择的订单.在产品订单方面,我想设置分配了oder的客户端; 然后,应从其先前已分配的客户列表中删除该产品订单,并将其添加到新分配的客户列表中.

我想使用纯JPA 2.0注释和一个"合并"调用到实体管理器(使用级联选项).我已尝试使用以下代码片段,但它不起作用(我使用EclipseLink 2.2.0作为持久性提供程序)

@Entity
public class Client implements Serializable {
    @OneToMany(mappedBy = "client", cascade= CascadeType.ALL)
    private List<ProductOrder> orders = new ArrayList<>();

    public void setOrders(List<ProductOrder> orders) {
        for (ProductOrder order : this.orders) {
            order.unsetClient();
            // don't use order.setClient(null);
            // (ConcurrentModificationEx on array)
            // TODO doesn't work!
        }
        for (ProductOrder order : orders) {
            order.setClient(this);
        }
        this.orders = orders;
    }

    // other fields / getters / setters
}

@Entity
public …
Run Code Online (Sandbox Code Playgroud)

java entity-relationship jpa one-to-many jpa-2.0

3
推荐指数
1
解决办法
2万
查看次数

Restangular:如何获取HTTP响应头?

我有一个REST服务器,它返回一个Link带有对PUT的响应的HTTP头,以指示新创建的实体的URL:

Link:<entities/6>; rel="created"
Run Code Online (Sandbox Code Playgroud)

有没有可能用Restangular读取该链接头?

到目前为止我唯一能够使用Restangular拦截HTTP请求的工具是在app config中注册响应拦截器:

restangular.addResponseInterceptor(function (data, operation, what, url, response, deferred) {
    console.log(response.headers())
    return response.data;
});
Run Code Online (Sandbox Code Playgroud)

但是,通过上面的演示实现,记录的唯一HTTP头是content-type.不过,我可以在一个响应来确实增加了不少额外的HTTP响应头,比如浏览器工具栏的发展看Server,Date和前述Link.

为什么我无法访问完整的HTTP响应头数组addResponseInterceptor()有没有办法使用Restangular捕获有问题的HTTP响应头?

注意:我不使用HAL或任何其他特殊响应正文格式搜索答案.我想知道我是否可以使用带有Restangular的普通HTTP头(如果没有,我可能会使用HAL或其他东西).

http-headers restangular

3
推荐指数
1
解决办法
5606
查看次数