java - hibernate 多对一外键未设置

标签 java hibernate spring hibernate-mapping hibernate-annotations

我有一个相当简单的一对多关系

[SampleAliasMask] has many [SampleAliasMaskPart]

我的问题是,当我保留带有集合部分的 SampleAliasMask 的新实例时,我遇到约束冲突,从 SampleAliasMaskPart 表到 SampleAliasMask 的外键链接被设置为 NULL。

我正在使用 hibernate 注释进行映射:

@Entity
@Table(name="SAMPLE_ALIAS_MASK")
public class SampleAliasMask extends ClientEntity {
    @OneToMany(mappedBy = "sampleAliasMask", fetch = FetchType.EAGER, cascade = javax.persistence.CascadeType.ALL, orphanRemoval = true)
    @Cascade(CascadeType.ALL)
    @Length(min = 1, message = "The sample alias mask must have components")
    private Set<SampleAliasMaskPart> components;

关系的另一半映射如下:

@Entity
@Table(name="SAMPLE_ALIAS_MASK_PART")
public class SampleAliasMaskPart extends ClientEntity {
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "SAMPLE_ALIAS_MASK_ID", nullable = false)
    private SampleAliasMask sampleAliasMask;

ClientEntity的相关部分是

@MappedSuperclass
public abstract class ClientEntity {
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

我正在创建这样的部件:

HashSet<SampleAliasMaskPart> components = new HashSet<>();
for(Map<String, Object> c : this.components) {
    SampleAliasMaskPart component = new SampleAliasMaskPart(Integer.parseInt(c.get("value").toString(), 10), c.get("name").toString());
    result.validate(component);
    components.add(component);
}
mask.setComponents(components);

我得到的确切错误是:

java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("ST"."SAMPLE_ALIAS_MASK_PART"."SAMPLE_ALIAS_MASK_ID")
<小时/>

我怀疑这个问题与我从未明确设置 SampleAliasMaskPart.sampleAliasMask 有关,但为什么我需要这样做?这种关系永远不会暴露或被操纵。该字段仅用于映射目的,这让我认为我映射错误。

最佳答案

你的假设是正确的。 Hibernate 使用关联的拥有方来了解关联是否存在。拥有方是没有mappedBy属性的一方。

一般规则是,当您有双向关联时,您有责任通过初始化/修改关联的两侧来使对象图保持一致。 Hibernate 不太关心它,但如果你不初始化拥有方,它就不会保留关联。

请注意,您不必强制此关联为双向。如果不这样做,那么将该部分添加到蒙版中就足够了,因为这一面(这是唯一的一面)是拥有的一面。

关于java - hibernate 多对一外键未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8780337/

相关文章:

java - 当我使用log4j 1.2.15时,编译出现错误;当更改为1.2.16时,一切都很好

java - 使用 apache activiti 检查下一个任务是否是结束事件

java - hibernate避免id

hibernate - Grails CXF 插件和 GORM

java - 为什么 SpEL 支持在 Spring Data JPA @Query 中不起作用?

java - Katharsis 结合 Spring Boot

spring - 包含在 openshift tomcat 上手动部署的 spring boot 应用程序的 WAR 不起作用

java - gson.toJson(object) BigDecimal 精度丢失

java - 是否有 "simple"Java 应用程序可以将带宽限制到指定限制的方法?

java - Jetty 服务器中项目部署期间发生 BeanCreationException