Java EE7由一堆"bean"定义组成:
为了摆脱我心中的混乱,我研究了几篇"何时使用哪种豆类"的文章.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服务器,因此没有干扰.
所以我的问题是:
(顺便说一句:有人在这里描述了类似的问题,但其解决方案并不适用于我的情况.
我与以下实体类具有双向一对多关系:
0或1个客户< - > 0个或更多产品订单
当持久化客户端实体时,我也希望持久化相关的产品订单实体(因为它们的"父"客户端的外键可能已被更新).
当然,所有必需的CASCADE选项都在客户端设置.但是,如果在引用现有产品订单时第一次持久保留新创建的客户端,则不起作用,如下所示:
我尝试了几个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) 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()方法不存在?
我目前正在尝试实现一些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方法的解决方案是优选的,但是任何帮助都将受到高度赞赏.
鉴于我有一个像这样的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示例.
我有一个双向的一对多关系.
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) 我有一个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或其他东西).
java ×3
jpa ×2
jpa-2.0 ×2
jta ×2
cdi ×1
ejb ×1
groovy ×1
http-headers ×1
java-ee ×1
knex.js ×1
maven ×1
node.js ×1
one-to-many ×1
querydsl ×1
restangular ×1