【问题标题】:Hibernate/JPA - one primary key parent to composite key childHibernate/JPA - 一个主键父级到复合键子级
【发布时间】:2018-01-13 10:55:44
【问题描述】:

我的 jpa 映射有什么问题,我试图将具有一个主键的父类映射到具有复合键的子类,但它似乎插入了错误的表中,它已经生成了 2 个表但不幸的是我没有绑定外键(policy_value_summary_id)

@Entity
@Table(name = "POLICY_VALUE_SUMMARY")
public class PolicyValueSummary {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="POLICY_VALUE_SUMMARY_ID")
    private Long policyValueSummaryId;

    @MapsId("policyValueSummaryId")
    @OneToMany
    private Set<PolicyValue> policyValues;
}

子类具有复合键,其中一个是父 ID。

@Entity
@Table(name = "POLICY_VALUE")
public class PolicyValue {

    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "policyValueSummaryId", column = @Column(name = "POLICY_VALUE_SUMMARY_ID")),
            @AttributeOverride(name = "planAtrId", column = @Column(name = "PLAN_ATR_ID")) })
    private PolicyValuePk policyValuePk;

}

这是我的子类复合键。

@Embeddable
public class PolicyValuePk implements Serializable {

    private Long policyValueSummaryId;

    private Long planAtrId;
}

我正在尝试用这样的策略值(子类)保存策略摘要值(父级)

        PolicyValuePk pk = new PolicyValuePk();
        pk.setPlanAtrId(Long.valueOf("1"));

        Set<PolicyValue> policyValues = new HashSet<>();
        policyValues.add(new PolicyValue(pk));

        PolicyValueSummary summary = new PolicyValueSummary();
        summary.setPolicyValues(policyValues);

        repo.save(summary);

这是输出给我的错误

Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into policy_value_summary (policy_value_summary_id) values (?)
Hibernate: insert into policy_value_summary_policy_values (policy_value_summary_policy_value_summary_id, policy_values_plan_atr_id, policy_values_policy_value_summary_id) values (?, ?, ?)
WARN 6880 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 972, SQLState: 42000
ERROR 6880 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ORA-00972: identifier is too long

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping


    【解决方案1】:

    不可以,在 Oracle 版本 12.2 之前,标识符的长度不得超过 30 个字符。见文档

    http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements008.htm#SQLRF00223
    

    但从 12.2 版本开始,它们最长可达 128 个字节

    【讨论】:

    • 但我已经为策略值添加了注释@Table(name = "POLICY_VALUE"),但它一直插入到错误的表和列中(它将父类连接到其子表和列)
    猜你喜欢
    • 2020-03-01
    • 2020-05-20
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2020-02-19
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多