class_docstr: Represent a series of key/value pairs.
  
  ConfigData will generate a new version of itself
  upon change.
  
  The "data" dictionary provides access via
  string name mapped to a string/int value.
code: def new_version(self, session):
      # convert to an INSERT
      make_transient(self)
      self.id = None
  
      # history of the 'elements' collection.
      # this is a tuple of groups: (added, unchanged, deleted)
      hist = attributes.get_history(self, "elements")
  
      # rewrite the 'elements' collection
      # from scratch, removing all history
      attributes.set_committed_value(self, "elements", {})
  
      # new elements in the "added" group
      # are moved to our new collection.
      for elem in hist.added:
          self.elements[elem.name] = elem
  
      # copy elements in the 'unchanged' group.
      # the new ones associate with the new ConfigData,
      # the old ones stay associated with the old ConfigData
      for elem in hist.unchanged:
          self.elements[elem.name] = ConfigValueAssociation(
              elem.config_value
          )
  
imports: from sqlalchemy import Column
  from sqlalchemy import create_engine
  from sqlalchemy import event
  from sqlalchemy import ForeignKey
  from sqlalchemy import Integer
  from sqlalchemy import String
  from sqlalchemy.ext.associationproxy import association_proxy
  from sqlalchemy.ext.declarative import declarative_base
  from sqlalchemy.orm import attributes
  from sqlalchemy.orm import backref
  from sqlalchemy.orm import make_transient
  from sqlalchemy.orm import relationship
  from sqlalchemy.orm import Session
  from sqlalchemy.orm import sessionmaker
  from sqlalchemy.orm import validates
  from sqlalchemy.orm.collections import attribute_keyed_dict
label_desc: Use image node_id 4 for calling the ConfigData obj's underlying member method code with example usage: obj.new_version(session) without return types