我正在研究hibernate 5并实现了ImplicitNamingStrategy接口。在其他方法中,有两个方法称为determinePrimaryKeyJoinColumnName(...)和determineJoinColumnName(...)。在java doc中,它说的是DetermPrimaryKeyJoinColumnName:
确定与{@link javax.persistence.PrimaryKeyJoinColumn}相关的列名。在 * {@code hbm.xml}条款,这是为{@code}定义的{@code} *或{@code}(其他人?)
我使用PrimaryKeyJoinColumn注释了我的连接并且代码正常工作,但名称永远不会通过determinePrimaryKeyJoinColumnName(...)进行路由,而是通过determineJoinColumnName(...)。
我认为这是一个错误我错了吗?
答案 0 :(得分:1)
@PrimaryKeyJoinColumn
可以像@JoinColumn
一样用于@OneToOne
映射。在这种情况下,不会使用额外的连接列,当然,也不会使用此类"不存在的列"没有生成。
@PrimaryKeyJoinColumn
也可用于继承。例如
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "someDiscriminator")
public class Customer {
@Id
@GeneratedValue
private Long customerPid;
@Column
private String customerName;
}
@Entity
@PrimaryKeyJoinColumn(name = "xxxYY")
public class ValuedCustomer extends Customer {
@Column
private String valuedCustomerName;
}
Hibernate将使用xxxYY
作为列名。但是,如果您没有指定名称
@Entity
@PrimaryKeyJoinColumn
public class ValuedCustomer extends Customer {
@Column
private String valuedCustomerName;
}
}
Hibernate不会使用determinePrimaryKeyJoinColumnName()
来生成名称。所以,看起来,这是一个错误。
Hibernate只在一个地方Ejb3JoinColumn.java#L719调用determinePrimaryKeyJoinColumnName()
。但我无法确定这种情况会发生。
当我尝试为Hibernate 5实现Hibernate 4 NamingStrategy
的适配器时,我也遇到过这样的问题。您可以参考ImprovedNamingStrategy for Hibernate 5获取其他注释。