Java ebean.save()未返回标识列值

Java ebean.save()未返回标识列值,java,orm,derby,ebean,Java,Orm,Derby,Ebean,我已经被以下问题困扰了一段时间,如果有任何帮助/提示,我将不胜感激 我的应用程序使用ebeans和一个derby数据库。它已经全部设置好并且工作正常,但是,我发现当我使用Ebean.save(object)方法时,对象的id字段(由derby自动生成)没有被添加到对象中 以下是我的模型类: @Entity @Table(name="GAME.Resource") public class Resource { @Id private Long oid; @Version private In

我已经被以下问题困扰了一段时间,如果有任何帮助/提示,我将不胜感激

我的应用程序使用ebeans和一个derby数据库。它已经全部设置好并且工作正常,但是,我发现当我使用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属性,以便Ebens知道我的数据库可以处理该属性并检索生成的值,但我在ebean.properties文件中找不到可以为此设置的属性列表

任何帮助、指导都将不胜感激

更新1: 我敢肯定,我离这里越来越近了,以下来自ApacheDerby的内容讲述了它如何允许自动生成密钥:

然后,这是ebeans API中设置ebeans的方法,以便它知道您的DB可以处理自动生成的密钥:

但是我仍然找不到如何使用.properties文件设置API方法

更新2: 我在avaje网站上找到了,该网站讨论了向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)
);

所以我终于让它工作了

我需要创建一个编程实现,而不是使用ebean.properties文件(我现在已经完全删除了该文件)

我的实现是一个简单的类,只需调用init()方法即可。。无论您需要什么(例如,在单元测试中设置,或者在使用spring时作为Springbean)


虽然此代码可能会回答该问题,但提供有关此代码为什么和/或如何回答该问题的附加上下文可提高其长期价值。
public class DatasourceConfig {

/**
 * Setup info came from: http://www.avaje.org/ebean/getstarted_programmatic.html
 */
public void init() {
    ServerConfig serverConfig = new ServerConfig();
    serverConfig.setName("derby");

    //Define datasource parameters
    DataSourceConfig derbyDb = new DataSourceConfig();  
    derbyDb.setDriver("org.apache.derby.jdbc.ClientDriver");  
    derbyDb.setUsername("");  
    derbyDb.setPassword("");  
    derbyDb.setUrl("jdbc:derby:/home/the_ox/dev/servers/derby-db/game/;");  
    derbyDb.setHeartbeatSql("select 1");  
    serverConfig.setDataSourceConfig(derbyDb);  

    // set DDL options...  
    serverConfig.setDdlGenerate(false);  
    serverConfig.setDdlRun(false);  

    serverConfig.setDefaultServer(true);

    //Setup derby specific identity 'stuff'.
    DatabasePlatform dbPlatform = new DatabasePlatform();
    dbPlatform.getDbIdentity().setIdType(IdType.IDENTITY);
    dbPlatform.getDbIdentity().setSupportsGetGeneratedKeys(true);
    dbPlatform.getDbIdentity().setSupportsSequence(false);
    dbPlatform.getDbIdentity().setSupportsIdentity(true);
    serverConfig.setDatabasePlatform(dbPlatform);

    //Specify jar to search for entity beans
    serverConfig.addJar("engine-0.0.1-SNAPSHOT.jar");

    // create the EbeanServer instance  
    EbeanServer server = EbeanServerFactory.create(serverConfig);  
}

}
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
}