views:

242

answers:

2

I am using Berkely DB and I have an error which says that mutations are missing. What does this mean?

Exception: com.sleepycat.persist.evolve.IncompatibleClassException: Mutation is missing to evolve class: TopMoveDAO.TopMoveClass version: 0 Error: java.lang.ClassNotFoundException: TopMoveDAO.TopMoveClasscom.sleepycat.persist.evolve.IncompatibleClassException: Mutation is missing to evolve class: TopMoveDAO.TopMoveClass version: 0 Error: java.lang.ClassNotFoundException: TopMoveDAO.TopMoveClass

at com.sleepycat.persist.impl.PersistCatalog.(PersistCatalog.java:365) at com.sleepycat.persist.impl.Store.(Store.java:180) at com.sleepycat.persist.EntityStore.(EntityStore.java:165) at TopMoveDAO.TopMovePut.setup(TopMovePut.java:40) at TopMoveDAO.TopMovePut.run(TopMovePut.java:59) at TopMoveDAO.TopMovePut.main(TopMovePut.java:84)

package TopMoveDAO;

import java.io.File;
import java.util.Timer;
import java.util.TimerTask;

import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;

import com.sleepycat.persist.EntityStore;
import com.sleepycat.persist.StoreConfig; 

public class TopMovePut {

    //private static File envHome = new File("C:/dev/je-3.3.75/");
 private static File envHome = new File("C:/dev/db/berkeley");


    private Environment envmnt;
    private EntityStore store;
    private TopMoveDA sda; 


//Next we create a method that simply opens our database environment and entity store for us.

   // The setup() method opens the environment and store
    // for us.
    public void setup()
        throws DatabaseException {

        EnvironmentConfig envConfig = new EnvironmentConfig();
        StoreConfig storeConfig = new StoreConfig();

        envConfig.setAllowCreate(true);
        storeConfig.setAllowCreate(true);

        // Open the environment and entity store
        envmnt = new Environment(envHome, envConfig);
       store = new EntityStore(envmnt, "EntityStore", storeConfig);
    } 

//We also need a method to close our environment and store.

    // Close our environment and store.
    public void shutdown()
        throws DatabaseException {

        store.close();
        envmnt.close();
    } 



//Populate the entity store
private void run()
    throws DatabaseException {

    setup();

    // Open the data accessor. This is used to store
    // persistent objects.
    sda = new TopMoveDA(store);

    // Instantiate and store some entity classes

    PriceElement pe1 = new PriceElement();

    pe1.setSecCode("UNO");
    pe1.setLastPrice(1);

    sda.pIdx.put(pe1);

    shutdown();
} 

//main
public static void main(String args[]) {
    //SimpleStorePut ssp = new SimpleStorePut();
    TopMovePut tmp = new TopMovePut();
    try {
        //ssp.run();
     tmp.run();
    } catch (DatabaseException dbe) {
        System.err.println("TopMovePut: " + dbe.toString());
        dbe.printStackTrace();
    } catch (Exception e) {
        System.out.println("Exception: " + e.toString());
        e.printStackTrace();
    }
    System.out.println("All done - TopMovePut.");
}

} 
A: 

You have to delete your existing database each time.

Ankur
+1  A: 

You have to write a mutation to evolve your database. Deleting the database will not solve the problem, only circumvent it ( which is fine if you have not yet deployed to production, but if you do not want to lose your existing data then write a mutation.)

Some changes to your persistent entities are handled automatically by Berkley db, such as adding a field. Ones that involve deleting data or renaming fields generally require you to write an explicit mutation. When you start using mutations you will also have to annotate your entities with version numbers which the mutations will refer to - even if the mutation is handled automatically you will have to increment the version number. When you make major structural changes such as using a different primary key, you will have to do an entire store conversion.

Take care when evolving a database in a replicated environment. I would strongly suggest reading the following:

http://www.oracle.com/technology/documentation/berkeley-db/je/java/com/sleepycat/persist/evolve/package-summary.html

murungu