[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] Defaults for @Table and @Column names
|
Hi Nate,
EclipseLink implements the defaults according to the JPA spec but
you can use a customizer to override those defaults. I've attached a
quickly thrown together example. It doesn't cover all the cases but
should give you an idea of what you can do. In my example I prefixed
all table names with "T_" but you can do the camel to underscore
conversion instead.
The essential idea is to use a session customizer to change the
default table names after EclipseLink has set them. The customerizer
is "model.MyCustomizer" and it's enabled by adding
<property name="eclipselink.session.customizer"
value="model.MyCustomizer"/>
to the persistence.xml.
I'm not sure if the JPA 2.0 spec will support a pluggable or
configurable Java name/Database naming strategy but I've passed your
email on to Mike Kieth who's on the JPA expert group.
Shaun
natjohns wrote:
Hello,
Does anyone know if there is a way to change the way that JPA (or the
eclipselink implemenation) generates default names for tables and
columns when using the @Table and @Column annotations? Or if this is
being talked about for version 2 of the JPA spec?
What I'd like is something similar to what Grails does, where they
change the camel capped Java names to underscores. Here's an example:
Say you have an EmployeeInfo class and one of the members is
defaultHomePhoneNumber.
Current Default in JPA:
Table name: EMPLOYEEINFO
Column name: DEFAULTHOMEPHONENUMBER
It's kind of hard to read. If we could specify a policy, say the camel
caps to underscore policy, it would look like this:
Table name: EMPLOYEE_INFO
Column name: DEFAULT_HOME_PHONE_NUMBER
Thanks all! And I apoligize if this has been talked about already... I
couldn't find anything in the searches.
Best,
Nate
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
--
Shaun Smith | Principal Product Manager, TopLink |
+1.905.502.3094
Oracle Fusion Middleware
110 Matheson Boulevard West, Suite 100
Mississauga, Ontario, Canada L5R 3P4
|
package model;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import model.User;
public class Demo {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("demo");
try {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
User user = new User();
em.persist(user);
em.getTransaction().commit();
em.close();
} finally {
emf.close();
}
}
}
package model;
import java.util.Collection;
import java.util.Map;
import java.util.Vector;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.internal.sessions.factories.SessionCustomizer;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.DirectToFieldMapping;
import org.eclipse.persistence.sessions.Session;
public class MyCustomizer implements SessionCustomizer {
public void customize(Session session) throws Exception {
Map<Class<?>, ClassDescriptor> descs = session.getDescriptors();
Collection<ClassDescriptor> descriptors = descs.values();
// This code assumes single table per descriptor!
for (ClassDescriptor desc : descriptors) {
String fullClassName = desc.getJavaClassName();
String className=Helper.getShortClassName(fullClassName);
String tableName = customizeTableName(className);
Vector<String> tableNames = new Vector<String>();
tableNames.add(tableName);
desc.setTableNames(tableNames);
updateMappings(desc, tableName);
}
}
private void updateMappings(ClassDescriptor desc, String tableName) {
for (DatabaseMapping mapping : desc.getMappings()) {
if (mapping.isDirectToFieldMapping()) {
DirectToFieldMapping directMapping = (DirectToFieldMapping) mapping;
directMapping.getField().setTableName(tableName);
}
}
}
private String customizeTableName(String className) {
return "T_" + className;
}
}
package model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private long id;
private String fullName;
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public long getId() {
return id;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="demo">
<class>model.User</class>
<properties>
<property name="eclipselink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="eclipselink.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:ORCL"/>
<property name="eclipselink.jdbc.user" value="scott"/>
<property name="eclipselink.jdbc.password" value="tiger"/>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.timestamp" value="false"/>
<property name="eclipselink.logging.thread" value="false"/>
<property name="eclipselink.logging.session" value="false"/>
<property name="eclipselink.session.customizer" value="model.MyCustomizer"/>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>