【发布时间】:2011-01-31 15:26:31
【问题描述】:
我正在尝试强制 JPA/Hibernate 生成并仅使用小写的表名。我已经实现了这样的命名策略:
public class MyNamingStrategy extends DefaultNamingStrategy {
@Override
public String classToTableName(String className) {
return super.classToTableName(className).toLowerCase();
}
}
我已经通过在persistence.xml中设置这个属性来应用它:
<property name="hibernate.ejb.naming_strategy" value="entities.strategy.MyNamingStrategy"/>
当我这样做时,我会得到这个堆栈跟踪:
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)
是什么
相同的物理表名[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;
// ...
}
【问题讨论】:
-
您能否提供更多信息 - 例如您的实体的映射。
-
我已经更新了我的问题。如果您需要更多,请告诉我。谢谢!
-
您确定您没有尝试创建已经存在的表吗?消息:
Same physical table name [planning] references several logical table names: [Planning]让我认为大写版本可能已经存在,而您的小写版本无法创建。请记住,大多数数据库引擎不区分大小写。
标签: java hibernate jpa java-ee-6 glassfish-3