PSQLException: ERROR: relation "dataobject" already exists (RESOLVED)

Hi All,
When I re-run the following code, I get a PSQL Exception that the relation dataobject already exists. Is there a property or param I can set somewhere so that it doesn’t attempt to re-create the tables ?

public class LEAFStandaloneApp {

/**
 * Class Logger
 */
private static final Logger LOGGER = LogManager.getLogger(LEAFStandaloneApp.class.getName());

/**
 * Main method. <br>
 * Creates an SQL Data Service and loads files from /src/main/resources
 * 
 * @param args
 * @throws Exception
 */
public static void main(final String[] args) throws Exception {
	LOGGER.info(String.format("%1$s starting", LEAFStandaloneApp.class.getSimpleName()));

	// Set up Caching Provider
	System.setProperty("javax.cache.spi.CachingProvider",
			"com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider");
	com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider; 
	IEventService eventService = new EventServiceSelector().getEventService();

	// Create Hibernate Session Factory
	SessionFactory sessionFactory = createFactory();

	// Create Data Service SQL
	IDataService dataService = DataServiceSql.newBuilder(eventService).withSessionFactory(sessionFactory).build();

	// Load all contents from /src/main/resources
	// Includes beanmetadata, dataobjects, lookuplists, and metadatatemplates
	dataService.upsertResources(ResourceLocations.INSTANCE, Context.makeSystemContext());

	// TODO: Set up REST calls to insert and retrieve data

}

/**
 * Method to create a Hibernate Session Factory. <br>
 * Based on code from {@link: HibernateSessionUtils}
 * 
 * @return SessionFactory
 */
public static SessionFactory createFactory() {

	Class<?>[] annotatedClasses = new Class<?>[] { DataChangeEventJpa.class, LookupListJpa.class,
			LookupListItemJpa.class, BeanMetadataJpa.class, AlternateIdFieldMetadataJpa.class,
			AltitudeFieldMetadataJpa.class, BooleanFieldMetadataJpa.class, CompositeFieldMetadataJpa.class,
			FormattedStringFieldMetadataJpa.class, CoordinateFieldMetadataJpa.class,
			CreatedByUsernameFieldMetadataJpa.class, CreatedDateFieldMetadataJpa.class, DateFieldMetadataJpa.class,
			DateFieldMetadataJpa.class, DateTimeFieldMetadataJpa.class, DateTimeFieldMetadataJpa.class,
			DisplayLabelFieldMetadataJpa.class, DistanceFieldMetadataJpa.class, DoubleFieldMetadataJpa.class,
			DynamicJobFieldMetadataJpa.class, DynamicLookupListFieldMetadataJpa.class,
			DynamicLookupListSubListJpa.class, EditionFieldMetadataJpa.class, EncryptedStringFieldMetadataJpa.class,
			FloatFieldMetadataJpa.class, FormulaFieldMetadataJpa.class, IdFieldMetadataJpa.class,
			IntegerFieldMetadataJpa.class, LastModifiedByUsernameFieldMetadataJpa.class,
			LastModifiedDateFieldMetadataJpa.class, ListOfDataObjectsFieldMetadataJpa.class,
			LongFieldMetadataJpa.class, LookupListFieldMetadataJpa.class, MetadataTemplateJpa.class,
			MultiValueLookupListFieldMetadataJpa.class, ParentIdFieldMetadataJpa.class,
			ParentTypeFieldMetadataJpa.class, QualifiedIdFieldMetadataJpa.class,
			QualifiedTypeFieldMetadataJpa.class, RootIdFieldMetadataJpa.class, RootTypeFieldMetadataJpa.class,
			SetOfStringsFieldMetadataJpa.class, StringFieldMetadataJpa.class, TagsFieldMetadataJpa.class,
			TimeFieldMetadataJpa.class, TimeFieldMetadataJpa.class, TypeFieldMetadataJpa.class,
			ValidationStringJpa.class, VersionFieldMetadataJpa.class };

	Configuration configuration = new Configuration();

	Properties settings = new Properties();
	settings.put(Environment.DRIVER, "org.postgresql.Driver");
	settings.put(Environment.URL, "jdbc:postgresql://localhost:5432/leaf");
	settings.put(Environment.USER, "Dhruti R-CTR Patel");
	settings.put(Environment.PASS, "password");
	settings.put(Environment.DIALECT, "org.hibernate.dialect.PostgreSQL95Dialect");
	settings.put(Environment.PHYSICAL_NAMING_STRATEGY,
			"org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
	settings.put(Environment.IMPLICIT_NAMING_STRATEGY,
			"org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl");
	// settings.put(Environment.GLOBALLY_QUOTED_IDENTIFIERS, true);
	settings.put(Environment.HBM2DDL_AUTO, "create-drop");

	configuration.setProperties(settings);

	StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
			.applySettings(configuration.getProperties()).build();
	try {
		MetadataSources metadataSources = new MetadataSources(registry);

		Arrays.stream(annotatedClasses).forEach(metadataSources::addAnnotatedClass);
		return metadataSources.buildMetadata().buildSessionFactory();
	} catch (Throwable t) {
		LOGGER.error("Uncaught exception while attempting to create SessionFactory.", t);
		StandardServiceRegistryBuilder.destroy(registry);
		throw t;
	}
}

}


Exception:

Caused by: org.postgresql.util.PSQLException: ERROR: relation “dataobject” already exists
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553) ~[postgresql-42.2.19.jar:42.2.19]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285) ~[postgresql-42.2.19.jar:42.2.19]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323) ~[postgresql-42.2.19.jar:42.2.19]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481) ~[postgresql-42.2.19.jar:42.2.19]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401) ~[postgresql-42.2.19.jar:42.2.19]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164) ~[postgresql-42.2.19.jar:42.2.19]
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:130) ~[postgresql-42.2.19.jar:42.2.19]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final]
… 52 common frames omitted

Is it possible you’ve deleted BeanMetadata since restarting your service? The way DataObject table creation works is we automatically create the first time a BeanMetadata is added. So if we detect that you’re adding a BeanMetadata on startup, and none exists in the BeanMetadata table, we determine we must create the DataObject tables. There are ways around this, but I wanted to check to see if this was possible first, because it’s definitely not a typical workflow to delete BeanMetadata. In development, sure, but in that case, it’s generally safe to just delete the DataObject tables as well if you’re going to delete the BeanMetadata types.

1 Like

Hi Mark,
I was able to fix the issue using the DropTableSQLGenerationService as mentioned here:
https://docs.leidos-leaf.com/stable/3.2/4.0-leaf-components/4.1-leaf-framework-services/leaf-daos/sql-daos/#dao-backed-dataobjectservice-details

Thanks,
Dhruti

Oh awesome! That was exactly what I was going to suggest assuming you were just trying to start fresh. Glad you were able to find that and thanks for posting the link here!

1 Like