我想更改我的Schema生成的外键列的名称。以下是我使用的架构配置:
<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 Id作为名为activityDim_ActivityFact_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的新手,我的理解可能有点断线。有人可以建议吗?
答案 0 :(得分:0)
免责声明:我是Hyperjaxb的作者。
这是一个初步答案,我们以后可能需要对其进行改进。
首先,请显示包含ActivityDim
和ActivityFact
的完整架构片段以及生成的内容。您在这里有many-to-one
或many-to-many
或one-to-many
关系吗?
接下来,检查customization guide。据我所知,您可能需要自定义外键列的名称。这应该是可能的OOTB而不实施自定义namin策略。假设您在这里有一个one-to-many
关系,这将是某个地方here。这是用于自定义的relevant part of the ORM schema。我认为您需要在此自定义join-column
的名称,以便我的猜测如下:
<hj:one-to-many>
<orm:join-column name="actvitiyDim"/>
</hj:one-to-many>
Here's an example from one of the test projects:
<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在模式编译期间使用的内部组件,用于生成表,列等的名称。因此它实际上非常低级。
如果由于某种原因需要不同的命名,您可以编写和配置自己的命名策略实现。例如,请参阅this test project。但它不再是自定义,它已经扩展 Hyperjaxb。您基本上重写 Hyperjaxb的一部分。例如,如果要更改默认情况下生成所有的FK名称的方式,则可以执行此操作。我不确定这是你想要的。