我刚刚开始使用Hibernate,到目前为止我看到的所有示例看起来都非常像Hibernate文档中的教程:
package org.hibernate.tutorial.domain;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
public Event() {}
/* Accessor methods... */
}
Run Code Online (Sandbox Code Playgroud)
具体来说:没有任何字段被声明为final
,并且必须有一个无参数构造函数,以便Hibernate框架可以实例化该类并设置其字段.
但事情就是这样 - 我真的不喜欢每当我能避免它时就以任何方式使我的类变得可变(Java实践:不可变对象为此做出了相当强烈的论据).那么,即使我要声明每个字段的"最终",有没有办法让Hibernate工作?
我知道Hibernate使用Reflection来实例化它的类,因此需要能够调用某种构造函数,而不会冒险选择错误的构造函数或将错误的值传递给它的一个参数,所以它可能更安全调用no-arg构造函数并一次设置一个字段.但是,是否应该可以向Hibernate提供必要的信息,以便它可以安全地实例化不可变对象?
public class Event {
private final Long id;
private final String title;
private final Date date;
public Event(@SetsProperty("id") Long id,
@SetsProperty("title") String title,
@SetsProperty("date") Date date) {
this.id = id;
this.title = title;
this.date = new Date(date.getTime());
}
/* Accessor methods... */
} …
Run Code Online (Sandbox Code Playgroud) 我是Guice的新手,我正在使用大量遗留代码的应用程序.它有几个类看起来像这样:
public final class DataAccessClass {
private Transaction txn;
@Inject //This was just added
public DataAccessClass(/* injectable parameters */, Transaction txn) {
this.txn = txn;
}
//Maybe add @Inject here to set a new transaction when it changes?
public void setTransaction(Transaction txn) {
this.txn = txn;
}
public void writeData(/* parameters for data to be written */) {
//Write data using the current instance of 'txn'
}
}
Run Code Online (Sandbox Code Playgroud)
很明显如何使用Guice绑定永不改变的实例,但是那些确实发生变化的实例(即事务)呢?有没有办法让我在改变时使用Guice注入不同的Transaction实例? 请注意,Transaction实例不是受到良好支持的JPA/Hibernate/Spring事务之一
我能想到的最少侵入性方法(避免需要同时迁移每个使用事务的类)将使用Guice仅在实例化对象时注入Transaction,并且我会保留现有的应用程序代码,以便在必要时更新事务.例如,此Provider可用于向当前的Transaction实例注入新对象:
public final class TransactionProvider implements Provider<Transaction> {
/** Nullable …
Run Code Online (Sandbox Code Playgroud) 在R6RS计划中抛出和捕获异常的标准方法是什么?我正在寻找适用于实现R6RS的任何版本的Scheme(不仅仅是PLT)的语法.
R6RS防护语法看起来可能适合该法案,但是有人能告诉我如何实际使用它的例子吗?
R6RS或Chez Scheme v7.9.4是否具有库函数来检查列表是否包含重复元素?
或者,是否具有集合的任何内置功能(允许重复元素)?到目前为止,我只能在这里找到一个例子.
问题在于它实际上并不是Chez Scheme库的一部分.虽然我可以编写自己的版本,但我更倾向于使用一个众所周知,经过测试和维护的库函数 - 特别是考虑到这是一个基本的操作.
因此,简单的"使用这些内置函数"或"没有内置库实现这一点"就足够了.谢谢!