在某些测试中,我有一个错误:
before_first_request
在数据库中,我有一个 primary_contact_information_id 列。
它在存储库尝试保存 Organisation 实体时发生。在Organization类中有一个 PrimaryContact 字段,在 PrimaryContact 类中,我有一个 contactInformation 字段。
该项目已从java7移至java8,目前,我正在从Hibernate 3迁移至Hibernate5。
有一个命名策略org.hibernate.cfg.ImprovedNamingStrategy,因此对于休眠5,我使用了 CustomNamingStrategy
some_func
组织
[<function some_func at 0x0000021393A0AD90>]
主要联系人
SqlExceptionHelper - Invalid column name 'contact_information_id'.
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement
联系信息
public class CustomNamingStrategy extends PhysicalNamingStrategyStandardImpl {
public static final CustomNamingStrategy INSTANCE = new CustomNamingStrategy();
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
return new Identifier(addUnderscores(name.getText()), name.isQuoted());
}
@Override
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
return new Identifier(addUnderscores(name.getText()), name.isQuoted());
}
protected static String addUnderscores(String name) {
final StringBuilder buf = new StringBuilder(name.replace('.', '_'));
for (int i = 1; i < buf.length() - 1; i++) {
if (
Character.isLowerCase(buf.charAt(i - 1)) &&
Character.isUpperCase(buf.charAt(i)) &&
Character.isLowerCase(buf.charAt(i + 1))) {
buf.insert(i++, '_');
}
}
return buf.toString().toLowerCase(Locale.ROOT);
}
}
如您所见,contactInformation字段下有一个@JoinColumn(name =“ primary_contact_information_id”),但这无济于事。
!!!更新!!!
由于我的自定义命名策略,似乎发生了这种奇怪的行为。因此,我决定将其删除。但是现在,在添加了必要的@Entity(name = "Organisation")
@Table(name = "organisation", uniqueConstraints = {@UniqueConstraint(name = "organisation_name_udx", columnNames = {"name"})})
@EntityListeners(EntityCreateListener.class)
public class Organisation implements Serializable, PatientListEntity {
// Some fields here
@Embedded
@Valid
private PrimaryContact primaryContact;
// Some fields here
}
批注之后,我收到了一个新错误:
@Embeddable
public class PrimaryContact extends Person implements Serializable {
private static final long serialVersionUID = 1L;
@Valid
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "primary_contact_information_id")
private ContactInformation contactInformation;
}
答案 0 :(得分:1)
发生此问题是由于Hibernate 5中的默认命名策略。它为每个( OneToOne,OneToMany,ManyToMany )关系添加了“ _id”。
@JoinColumn(name = <correct_name_from_db>)
将对其进行修复。
就我而言,还有一个 ContactInformation 字段,没有 JoinColumn 批注。