我有一个表格可以填写 POJO,名为Father
。在里面,我有一个FotoFather
field.
当我保存一个新的 Father 时,我会自动保存 FotoFather 对象(使用 Hibernate ORM 模式)。
FotoFather.fotoNaturalUrl
必须填写的值Father.id
问题就在这里!
当我存钱的时候Father
在数据库上,当然我还没有Father.id
填充值FotoFather.fotoNaturalUrl
。我怎么解决这个问题?
谢谢
@Entity
@Table(name = "father")
public class Father implements Serializable{
...
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
...
@OneToOne(targetEntity = FotoFather.class, fetch = FetchType.EAGER)
@JoinColumn(name = "fotoFather", referencedColumnName = "id")
@Cascade(CascadeType.ALL)
private FotoFather fotoFather;
}
FotoFather.class
@Entity
@Table(name = "foto_father")
public class FotoFather.class{
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
...
@Column(name = "foto_natural_url")
private String fotoNaturalUrl;
...
}
如果您只是需要完整的 URL 来实现某些特定于应用程序的目的,那么我可能会犯错误,根本不尝试将 URL 与 ID 一起存储,而是依赖瞬态方法。
public class FotoFather {
@Transient
public String getNaturalUrl() {
if(fotoNaturalUrl != null && fotoNaturalUrl.trim().length > 0) {
return String.format("%s?id=%d", fotoNaturalUrl, id);
}
return "";
}
}
事实上,将 URL 进一步分解为极简的变量组件并仅将它们存储在单独的列中可能会带来技术债务,特别是在 URL 发生变化的情况下。这样,基本 URL 就可以是应用程序可配置的,并且控制最终 URL 端点的变量方面都是您所存储的。
但是,如果您必须提前知道 ID(或者像我最近的情况一样,保持标识符连续而不丢失单个值),则需要在以下位置处理此问题:FotoFather
标识符是在持久化实体之前生成的,因此它们不是@GeneratedValue
s.
为了避免插入时发生冲突问题,我们有一个序列服务类,它公开了对按名称获取下一个序列值的支持。序列表行在读取时被锁定,并在提交时更新。这可以防止多个会话出现相同序列的并发问题,防止范围内出现间隙,并允许提前了解标识符。
@Transactional
public void save(Father father) {
Assert.isNotNull(father, "Father cannot be null.");
Assert.isNotNull(father.getFotoFather(), "FotoFather cannot be null.");
if(father.getFotoFather().getId() == null) {
// joins existing transaction or errors if one doesn't exist
// when sequenceService is invoked.
Long id = sequenceService.getNextSequence("FOTOFATHER");
// updates the fotofather's id
father.getFotoFather().setId(id);
}
// save.
fatherRepository.save(father);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)