Bog*_*dan 13 java hibernate jpa java-ee-6 glassfish-3
我试图强制JPA/Hibernate生成并只使用小写的表名.我已经实现了这样的NamingStrategy:
public class MyNamingStrategy extends DefaultNamingStrategy {
@Override
public String classToTableName(String className) {
return super.classToTableName(className).toLowerCase();
}
}
Run Code Online (Sandbox Code Playgroud)
我通过在persistence.xml中设置此属性来应用它:
<property name="hibernate.ejb.naming_strategy" value="entities.strategy.MyNamingStrategy"/>
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到这个堆栈跟踪:
SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method
org.hibernate.DuplicateMappingException: Same physical table name [planning] references several logical table names: [Planning], [OrderProductMan_Planning]
at org.hibernate.cfg.Configuration$MappingsImpl.addTableBinding(Configuration.java:2629)
at org.hibernate.cfg.annotations.TableBinder.buildAndFillTable(TableBinder.java:254)
at org.hibernate.cfg.annotations.TableBinder.bind(TableBinder.java:177)
Run Code Online (Sandbox Code Playgroud)
什么是
相同的物理表名称[planning]引用了多个逻辑表名称:[Planning],[OrderProductMan_Planning]
意思?
来自错误的实体,尽可能简化.如果你需要休息,请告诉我.
@Entity
public class Planning implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer qty;
@ManyToOne
private OrderProductMan orderProduct;
....
}
@Entity
@Table
public class OrderProductMan implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
private Integer opId;
@Basic(optional = false)
private int qty;
@ManyToOne(optional = false)
private ProductMan produse;
@ManyToOne(optional = false)
private OrderMan orders;
@Transient
private int totalScheduled;
@Transient
private int totalProduced;
// ...
}
Run Code Online (Sandbox Code Playgroud)
小智 2
博格丹,感谢您发布此内容。我在 Linux 上使用 Hibernate/JPA/MySQL 时,对于 Unix/Windows 可移植性的区分大小写的表名也遇到了类似的问题。
和您一样,我开始通过在 META-INF/persistence.xml 文件中配置自定义 NamingStrategy 将表名绑定为全部小写:
<property name="hibernate.ejb.naming_strategy" value="my.package.LowerCaseNamingStrategy" />
Run Code Online (Sandbox Code Playgroud)
我得到了同样的异常:org.hibernate.DuplicateMappingException:相同的物理表名称...通过使用调试器,我突然顿悟,也许我一开始就没有使用DefaultNamingStrategy!所以我将基类更改为 org.hibernate.cfg.EJB3NamingStrategy。我相信这在使用 JPA Annotations 时更合适!这是我最终的命名策略:
package my.package;
import org.apache.commons.lang.StringUtils;
import org.hibernate.cfg.EJB3NamingStrategy;
public class LowerCaseNamingStrategy extends EJB3NamingStrategy {
@Override
public String classToTableName(String className) {
return StringUtils.lowerCase(super.classToTableName(className));
}
@Override
public String collectionTableName(String ownerEntity, String ownerEntityTable, String associatedEntity,
String associatedEntityTable, String propertyName) {
return StringUtils.lowerCase(super.collectionTableName(ownerEntity, ownerEntityTable, associatedEntity, associatedEntityTable, propertyName));
}
@Override
public String logicalCollectionTableName(String tableName, String ownerEntityTable, String associatedEntityTable,
String propertyName) {
return StringUtils.lowerCase(super.logicalCollectionTableName(tableName, ownerEntityTable, associatedEntityTable, propertyName));
}
@Override
public String tableName(String tableName) {
return StringUtils.lowerCase(super.tableName(tableName));
}
}
Run Code Online (Sandbox Code Playgroud)
PS:dursun 之前的解决方案对我不起作用。
| 归档时间: |
|
| 查看次数: |
16339 次 |
| 最近记录: |