具有嵌入式字段的列名无效

时间:2018-12-27 13:10:08

标签: java spring hibernate

在某些测试中,我有一个错误:

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;
}

1 个答案:

答案 0 :(得分:1)

发生此问题是由于Hibernate 5中的默认命名策略。它为每个( OneToOne,OneToMany,ManyToMany )关系添加了“ _id”。 @JoinColumn(name = <correct_name_from_db>)将对其进行修复。

就我而言,还有一个 ContactInformation 字段,没有 JoinColumn 批注。