JVxEE 1.2
JVxEE version 1.2 is out!
The good news
JVxEE is now available from Maven central, that means that you can add it as dependency to your Maven projects:
<groupId>com.sibvisions.jvx</groupId>
<artifactId>jvxee</artifactId>
<version>1.2</version>
</dependency>
The first of the two major changes are that we fixed possible exceptions that might be thrown by JPAStorage.getEstimatedRowCount(ICondition), it should now work under all situations.
The second change is the handling of foreign key columns. Previously, foreign key columns where named with the pattern "REFERENCEDTABLE_REFERENCEDCOLUMN", which can lead to collisions if there is more than one column referencing the same table and primary key. So it was possible that you would end up with two columns with the same name, which of course can't be handled by the storage and databook correctly. We devised a new naming scheme and from now on the foreign key columns are named with a combination of the referencing column and the referenced column.
An example:
{
@Id private int id;
private B source;
private B target;
// Getters/Setters
}
@Entity public class B
{
@Id private int id;
private String name;
// Getters/Setters
}
With 1.1 the generated columns would look like this, for entity "A":
B_ID BigDecimal
B_NAME String
B_ID BigDecimal
B_NAME String
And with 1.2:
SOURCE_ID BigDecimal
SOURCE_NAME String
TARGET_ID BigDecimal
TARGET_NAME BigDecimal
This is definitely an improvement!
The bad news
There is always a downside
The changes in the foreign key column naming scheme, to avoid collisions, also mean that most foreign key columns do now have a different name. You'll have to check your code for usages of the now differently named columns.
But there is also an upside! With EPlug you will find those easily.
Usage example
JVxEE provides the possibility to utilize the Java Persistence API (JPA) as backend for storages and databooks. JPA is powered by POJOs, like these:
{
private String country;
private String description;
@Id @OneToMany private String registrationNumber;
}
@Entity public class Airport
{
@Id @OneToMany private String code;
private String country;
private String location;
private String name;
}
@Entity public class Flight
{
@OneToOne private Aircraft aircraft;
private String airline;
@OneToOne private Airport airportDestination;
@OneToOne private Airport airportOrigin;
@Id private String flightNumber;
}
This is an extremely simplified model for airline flights.
There is an aircraft that can be used, airports that can be flown to and from and the flight itself. Flight is referencing both, the aircraft and the airport. Now we only need to tell JPA about these classes by placing a persistence.xml in the META-INF directory, like this one that we use for our unit tests:
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
<class>com.sibvisions.rad.persist.jpa.entity.flight.Aircraft</class>
<class>com.sibvisions.rad.persist.jpa.entity.flight.Airport</class>
<class>com.sibvisions.rad.persist.jpa.entity.flight.Flight</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:hsql://localhost/db" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>
</persistence>
(Sure, it's also possible without manual XML mapping)
Now all that is left is creating a new storage that uses the JPA:
EntityManager entityManager = entityManagerFactory.createEntityManager();
JPAStorage storage = new JPAStorage(Flight.class);
storage.setEntityManager(entityManager);
storage.open();
And that's it! From here on there is only JVx code.