I feel so stupid.. you are perfectly right, thank you once again for everything... now it works so if anybody else wants to work with assigned ID's and wants to use sequences here is the sequence generator (for the DDL)
Code:
package net.sourceforge.lebon.hibernate;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.Mapping;
import org.hibernate.mapping.AuxiliaryDatabaseObject;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.SimpleValue;
import java.util.Iterator;
/**
* Created by IntelliJ IDEA.
* User: sorin
* Date: Aug 29, 2006
* Time: 9:52:32 AM
* To change this template use File | Settings | File Templates.
*/
public class SequenceCreator implements AuxiliaryDatabaseObject {
public static final String SEQUENCE = "sequence";
private static String CONFIG_FILE_LOCATION = "net/sourceforge/lebon/hibernate/hibernate.cfg.xml";
private static final Configuration cfg = new Configuration();
public void addDialectScope(String string) {
//To change body of implemented methods use File | Settings | File Templates.
}
public boolean appliesToDialect(Dialect dialect) {
return dialect.supportsSequences();
}
public String sqlCreateString(Dialect dialect, Mapping mapping, String string, String string1) throws HibernateException {
String sql = "";
cfg.configure(CONFIG_FILE_LOCATION);
Iterator iter = cfg.getClassMappings();
while (iter.hasNext()) {
String sequence_name = null;
String sequence_SQL[] = null;
PersistentClass clazz = (PersistentClass) iter.next();
if (!clazz.isJoinedSubclass()) {
Property pr = clazz.getIdentifierProperty();
sequence_name = ((SimpleValue) pr.getValue()).getIdentifierGeneratorProperties().getProperty(SEQUENCE);
sequence_SQL = dialect.getCreateSequenceStrings(sequence_name);
sql = sql + "\n";
for (int i = 0; i < sequence_SQL.length; i++) {
sql = sql + sequence_SQL[i] + ((i + 1 < sequence_SQL.length) ? ";\n" : "");
}
}
}
return sql;
}
public String sqlDropString(Dialect dialect, String string, String string1) {
return "";
}
}
and to use it you just have to add this to your mapping files:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<database-object>
<definition class="net.sourceforge.lebon.hibernate.SequenceCreator"/>
</database-object>
</hibernate-mapping>
and this is the code generator I use
Code:
package net.sourceforge.lebon.dao.id.impl;
import org.hibernate.StatelessSession;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.id.SequenceGenerator;
import org.hibernate.type.LongType;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import net.sourceforge.lebon.dao.id.IdGenerator;
import net.sourceforge.lebon.model.*;
/**
* @author Manfred Geiler (latest modification by $Author: gem $)
* @version $Revision: 581 $ $Date: 27.06.2006 14:17:42$
*/
public class IdGeneratorImpl
implements IdGenerator
{
private static final Log log = LogFactory.getLog(IdGeneratorImpl.class);
private SessionFactoryImplementor _sessionFactory;
private Map<Class, SequenceGenerator> _sequenceGeneratorMap = new HashMap<Class,SequenceGenerator>();
private Map<Class, SequenceGenerator> _sequenceGeneratorCacheMap = new HashMap<Class,SequenceGenerator>();
public void setSessionFactory(SessionFactoryImplementor sessionFactory)
{
_sessionFactory = sessionFactory;
}
private SequenceGenerator getSequenceGenerator(String seqName)
{
Properties props = new Properties();
props.put("sequence", seqName);
SequenceGenerator sequenceGenerator = new SequenceGenerator();
sequenceGenerator.configure(new LongType(), props, _sessionFactory.getDialect());
return sequenceGenerator;
}
public void init()
{
_sequenceGeneratorMap.put(DeveloperProfile.class, getSequenceGenerator("DEVP_SEQ"));
_sequenceGeneratorMap.put(Election.class, getSequenceGenerator("EL_SEQ"));
_sequenceGeneratorMap.put(ElectionCategory.class, getSequenceGenerator("ELC_SEQ"));
_sequenceGeneratorMap.put(ElectionWinners.class, getSequenceGenerator("ELW_SEQ"));
_sequenceGeneratorMap.put(ProjectProfile.class, getSequenceGenerator("PRP_SEQ"));
_sequenceGeneratorMap.put(Transaction.class, getSequenceGenerator("TR_SEQ"));
_sequenceGeneratorMap.put(User.class, getSequenceGenerator("USR_SEQ"));
_sequenceGeneratorMap.put(Vote.class, getSequenceGenerator("VT_SEQ"));
_sequenceGeneratorMap.put(VotingRight.class, getSequenceGenerator("VTR_SEQ"));
_sequenceGeneratorCacheMap.putAll(_sequenceGeneratorMap);
}
public Long createId(Object entity)
{
StatelessSession session = null;
try
{
Class<? extends Object> entityClass = entity.getClass();
SequenceGenerator sequenceGenerator = _sequenceGeneratorCacheMap.get(entityClass);
if (sequenceGenerator == null)
{
for (Map.Entry<Class,SequenceGenerator> entry : _sequenceGeneratorMap.entrySet())
{
if (entry.getKey().isAssignableFrom(entityClass))
{
sequenceGenerator = entry.getValue();
break;
}
}
if (sequenceGenerator == null)
{
throw new IllegalArgumentException("Unsupported entity class " + entityClass);
}
_sequenceGeneratorCacheMap.put(entityClass, sequenceGenerator);
log.debug("Added new SequenceGenerator for class " + entityClass + " to cache");
}
session = _sessionFactory.openStatelessSession();
return (Long)sequenceGenerator.generate((SessionImplementor)session, entity);
}
finally
{
if (session != null)
{
session.close();
}
}
}
}