JpaPersistModule, Hibernate and URL Variables

118 views
Skip to first unread message

Evan Ruff

unread,
Feb 14, 2018, 5:38:16 AM2/14/18
to google-guice
Hey guys,

I've got what I think is a pretty straightforward task but I'm having a little issue figuring out where to attach in my code.

I've got an embedded H2 database being used in an installed application to manage state of some objects. I'm using Hibernate as my JPA implementation and everything is working great. The one issue I have is that the path of the database file is set in my URL as:

jdbc:h2:file:./data/application_db;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE;

which changes depending on how the application is executed. I'd like to have the database file be written in a location set by an environment variable, so that I'd have:

jdbc:h2:file:$APP_DB_PATH/data/application_db;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE;

I've tried several different forms and it doesn't seem to be taking. 

Has anyone encountered this and could give me a pointer on how to implement?

Thanks!

E

Stephan Classen

unread,
Feb 14, 2018, 10:43:52 AM2/14/18
to google...@googlegroups.com, Evan Ruff

When are you passing this string?
Is it part of you Giuce Module??

Could you read the environment variable before creating the string and than manually create the URL string?

--
You received this message because you are subscribed to the Google Groups "google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-guice...@googlegroups.com.
To post to this group, send email to google...@googlegroups.com.
Visit this group at https://groups.google.com/group/google-guice.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-guice/ed5b261c-62de-41b1-872f-7585ca134d0f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Sondre Bjornebekk

unread,
Feb 14, 2018, 10:58:11 AM2/14/18
to google-guice
If you always want to use h2, you could just simply build the string using https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getenv--?

If you wanted to inject different JPA providers, you could certainly use Guice for that (since you posted here) - I have a HibernateSessionFactory that provides a session per request like this:

@Provides
@RequestScoped
private Session provideSession() {


And then for my jUnit tests I have:

@Provides
@Singleton
private Session provideSession() {

in a

public class TestGuiceModule extends AbstractModule

Would that fit your use case?

Cheers,

-S-

Evan Ruff

unread,
Feb 14, 2018, 3:06:34 PM2/14/18
to google-guice
Hey guys,

So I'm actually just letting Guice Persist pull it straight out of META-INF/persistence.xml file. 

I'm wondering where I can either change the URL or set it explicitly, while still using Guice Persist.

thanks!

E

Stephan Classen

unread,
Feb 14, 2018, 6:13:43 PM2/14/18
to google...@googlegroups.com
Maybe you can make your path relative to the user directory as described here:
http://www.h2database.com/html/faq.html#database_files

Evan Ruff

unread,
Feb 15, 2018, 6:05:26 AM2/15/18
to google-guice
I'd really like to be able to define the location of the DB, as multiple services will be accessing it.

I'm okay with moving away from the persistence.xml file and rolling the configuration in code, but I'm not sure where to do that while still using JpaPersistModule. Has anyone tried a declarative approach? Any examples anywhere?

E

Stephan Classen

unread,
Feb 15, 2018, 6:47:33 AM2/15/18
to google...@googlegroups.com

Only way you can try to achieve this is the methode: JpaPersistModule.setProperties()
The properties passed in will be used to create the entity manager factory (see JpaPersistService.start())

Maybe you can overwrite the URL in the properties you pass.

--
You received this message because you are subscribed to the Google Groups "google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-guice...@googlegroups.com.
To post to this group, send email to google...@googlegroups.com.
Visit this group at https://groups.google.com/group/google-guice.

Evan Ruff

unread,
Feb 15, 2018, 8:46:48 AM2/15/18
to google-guice
scl,

Thanks for the tip, this works as expected. JpaPersistModule is final (ARGH) but I created a static utility class with an install method that handles it. I build the database connection string using the env props and then I'm able to set it using the JpaPersistModule.properties( <?,?> prop ) method. Set a map of strings in there, and it appears that it will use those values to overwrite what comes out of the META-INF/persistence.xml file.

Best of both worlds!

Thanks!

E

Stephan Classen

unread,
Feb 15, 2018, 8:50:51 AM2/15/18
to google...@googlegroups.com

Can't you simply do the following??

public class MyModule extends ServletModule {
  protected void configureServlets() {
    install(new JpaPersistModule("myJpaUnit").setProperties(myProperties));
  }
}

Evan Ruff

unread,
Feb 15, 2018, 9:05:23 AM2/15/18
to google-guice
I mean, sure you could, but I don't like to put the business login in my Bootstrap too much. It just felt cleaner the way I did it. I have defaults, logging, failover, warnings etc if the environment isn't setup quite the way I think it should be.
Reply all
Reply to author
Forward
0 new messages