我正在使用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;
}
答案 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转移到所有者属性注释。