JPA / JaxB可以自己填充外键吗?

时间:2015-04-09 17:34:29

标签: java hibernate jpa jaxb eclipselink

我正在使用JPA注释的类将xml数据映射到数据库,反之亦然通过JAXB。问题是JAXB创建的对象不包含外键字段,因此为null。 以下示例中包含所有者ID。

有没有办法解决这个问题而不再遍历整个树并添加外键?

@Entity    
public class Element {
    @Id
    String id;

    @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY, cascade = CascadeType.ALL)    
    private List<Property> properties;     
}

@Entity    
public class Property {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int propertyId;

    @ManyToOne(optional = false, cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn(name = "ownerId", referencedColumnName = "id")
    private Element owner;
}

2 个答案:

答案 0 :(得分:0)

该关系由Property拥有,因此Property必须知道相关的Element对象才能将其保存到DB。将属性添加到元素内的列表是不够的。

for (Property p : element.getProperties()) p.setOwner(element);

将使用密钥解决问题。

如果您从XML读取数据,通常您的Property不会包含引用的Element,只有Element会包含Included属性列表。

您可能还想从属性中的CascateType.ALL中删除ManyToONe,因为删除属性会删除其父元素和所有相关属性,这可能不是您想要的。 但是您可能希望将orphanRemoval = true添加到Element中的OneToMany,因此如果从列表中删除属性,它也会在DB中删除。

答案 1 :(得分:0)

如何将ownerId属性添加到Property类中?

    @Column("ownerId", insertable=false, updatable="false")
    private ownerId;

在这种情况下,您的班级中将同时包含 ownerId 所有者 ownerId 是只读的,所有者用于分配/更新值。

如果你想以相反的方式将insertable = false,updatable = false转移到所有者属性注释。