【问题标题】:ebean .save() not returning identity column valueebean .save()不返回标识列值
【发布时间】: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)
);

【问题讨论】:

    标签: java orm derby ebean


    【解决方案1】:

    所以我终于让它工作了。

    我需要创建一个编程实现而不是使用 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);  
    }
    
    }
    

    【讨论】:

      【解决方案2】:
      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
      }
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      猜你喜欢
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 2012-12-24
      • 2013-08-02
      • 2020-04-02
      相关资源
      最近更新 更多