ebean .save()不返回标识列值

时间:2013-12-27 11:40:14

标签: java orm derby ebean

我已经坚持了一段时间了,并希望得到任何帮助/提示。

我的应用程序使用的是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)
);

2 个答案:

答案 0 :(得分:0)

所以我终于让它运转了。

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

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

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

}

答案 1 :(得分:0)

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
}