【发布时间】:2013-12-27 11:40:13
【问题描述】:
我一直坚持以下问题,如果有任何帮助/提示,我将不胜感激。
我的应用程序正在使用 ebeans 和 derby db。一切都已设置好并且工作正常,但是,我发现当我使用 Ebean.save(object) 方法时,对象的 id 字段(由 derby 自动生成)没有被添加到对象中。
以下是我的模型类:
@Entity
@Table(name="GAME.Resource")
public class Resource {
@Id
private Long oid;
@Version
private Integer version;
private String name;
private String description;
@Column(name = "spaceRequired")
private Integer spaceRequired;
我现在有一个简单的测试助手类,创建一个随机资源并调用 save 方法:
public static Resource createResource() {
Resource resource = new Resource();
resource.setDescription(RandomStringUtils.randomAlphabetic(100));
resource.setName(RandomStringUtils.randomAlphabetic(20));
resource.setSpaceRequired(Integer.valueOf(RandomStringUtils.randomNumeric(3)));
Ebean.save(resource);
return resource;
}
我的 ebean.properties 文件是这样的:
# specify jars to search for entity beans
ebean.search.jars=engine-0.0.1-SNAPSHOT.jar
# -------------------------------------------------------------
# Load (Dev/Test/Prod) properties external to your war/jar
# -------------------------------------------------------------
# You can use load.properties to load the properties from a
# file external to your war/jar.
#load.properties.override=${CATALINA_HOME}/conf/myapp.ebean.properties
ebean.ddl.generate=false
ebean.ddl.run=false
ebean.debug.sql=true
ebean.debug.lazyload=false
# -------------------------------------------------------------
# Transaction Logging
# -------------------------------------------------------------
# Use java util logging to log transaction details
#ebean.loggingToJavaLogger=true
# General logging level: (none, explicit, all)
ebean.logging=all
# Sharing log files: (none, explicit, all)
ebean.logging.logfilesharing=all
# location of transaction logs
ebean.logging.directory=logs
#ebean.logging.directory=${catalina.base}/logs/trans
# Specific Log levels (none, summary, binding, sql)
ebean.logging.iud=sql
ebean.logging.query=sql
ebean.logging.sqlquery=sql
ebean.logging.txnCommit=none
# -------------------------------------------------------------
# DataSources (If using default Ebean DataSourceFactory)
# -------------------------------------------------------------
# You can specify many DataSources (one per EbeanServer) and
# one of them is defined as the default/primary DataSource
# specify the default/primary DataSource
datasource.default=derby
datasource.derby.username=
datasource.derby.password=
datasource.derby.databaseUrl=jdbc:derby:/home/ali/dev/servers/derby-db/game/;
datasource.derby.databaseDriver=org.apache.derby.jdbc.ClientDriver
datasource.derby.minConnections=1
datasource.derby.maxConnections=25
datasource.derby.heartbeatsql=select 1
datasource.derby.isolationlevel=read_committed
如果我对测试助手进行调试,则在调用 save() 之后,刚刚保存的资源对象不会将其 oid 值插入其中。当我检查数据库时,我可以看到它已经成功插入了一条记录。
在我的研究中,我认为我需要设置 generatedkeys 属性,以便 ebeans 知道我的数据库可以处理它并检索生成的值,但是我无法在任何地方找到可以在 ebean 中设置的属性列表.properties 文件以执行此操作。
任何帮助,方向将不胜感激。
更新 1: 我确信我越来越近了,来自 apache derby 的以下内容讨论了它如何允许自动生成的密钥:http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
然后这来自 ebeans API 是您设置 ebeans 的方式,以便它知道您的数据库可以处理自动生成的密钥:http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/config/dbplatform/DbIdentity.html#setSupportsGetGeneratedKeys%28boolean%29
但我仍然找不到如何使用 .properties 文件设置该 API 方法!
更新 2: 我在 avaje 网站上找到了this,它谈到了在 system.properties 文件中添加行以进行设置。我假设 system.properties 文件是我的 ebean.properties 文件?我添加了以下两行,仍然没有运气...
ebean.derby.supportsGetGeneratedKeys=true
ebean.derby.identityGeneration=identity
更新 3: 正在使用以下 SQL 生成表:
CREATE TABLE GAME.Resource (
oid BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
version INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
description VARCHAR(511) NOT NULL,
spaceRequired INTEGER NOT NULL,
PRIMARY KEY(oid)
);
【问题讨论】: