[英]Rename the generated foreign key column generated using custom Naming Strategy
我想更改由我的架构生成的外键列的名称。 以下是我正在使用的架构配置:
<xs:complexType name="ActivityFact">
<xs:sequence>
<!-- Other Element Declaration -->
</xs:sequence>
<xs:attribute name="id" type="xs:long" />
</xs:complexType>
当我运行此配置时,我得到2个表:1. ActivityDim 2. ActivityFact(作为名称为ActivityDim_ActivityFact_Id的外键的ActivityDim ID)
我想将上面生成的名称更改为在这种情况下为actvitiyDim的架构元素名称。 我不确定如何使用自定义命名策略。 我试图覆盖foreignKeyColumnName方法,但是没有用
public class ForeignKeyNamingStrategy extends ImprovedNamingStrategy {
private final static Logger logger = LoggerFactory.getLogger(ForeignKeyNamingStrategy.class);
@Override
public String foreignKeyColumnName(
String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
) {
return propertyName;
}
我在persistence.xml中也提供了此类参考
<persistence version="2.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd
http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<persistence-unit name="reportingData">
<!-- These properties are defined in persistence-model/src/main/resources/persistence.xml.
HyperJAXB3 merges them into its generated and final persistence.xml -->
<properties>
<property name="hibernate.ejb.naming_strategy"
value="com.namingStrategy.ForeignKeyNamingStrategy" /></properties>
</persistence-unit>
</persistence>
我是Hibernate的新手,我的理解可能会有点疏远。 有人可以建议吗?
免责声明:我是Hyperjaxb的作者。
这是一个初步的答案,稍后我们可能需要对其进行完善。
首先,请显示带有ActivityDim
和ActivityFact
的完整架构片段以及生成的内容。 您在这里有many-to-one
或many-to-many
或one-to-many
关系吗?
接下来,查看自定义指南 。 据我了解您的问题,您可能需要自定义外键列的名称。 如果不执行自定义的namin策略,这可能是OOTB。 假设您在这里有one-to-many
关系,那么这将在这里 。 这是用于定制的ORM架构的相关部分 。 我认为您需要在此处自定义join-column
的名称,所以我的猜测将是这样的:
<hj:one-to-many>
<orm:join-column name="actvitiyDim"/>
</hj:one-to-many>
<xs:element name="one-to-many-join-column" type="test:two" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<hj:one-to-many>
<orm:join-column name="O2MJC_ONE_ID"/>
</hj:one-to-many>
</xs:appinfo>
</xs:annotation>
</xs:element>
可能非常接近您的情况。
现在,命名策略。
命名策略与Hibernate或JPA无关。 命名策略是Hyperjaxb3在架构编译期间使用的内部组件,用于生成表,列等的名称。因此,它实际上是非常底层的。
如果出于某种原因想要不同的命名,则可以编写和配置自己的命名策略实现。 例如,请参见此测试项目 。 但是它不再是自定义的 ,它已经扩展了 Hyperjaxb。 您基本上将重写 Hyperjaxb的一部分。 例如,如果要更改默认情况下生成所有 FK名称的方式,可以执行此操作。 我不确定这就是您想要的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.