有关联实体的简单模型:
MainModel类
@Entity
@Table(name = "main_model")
public class MainModel
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "id_main_model", referencedColumnName = "id")
private List<AssociatedModel> am_collection;
public MainModel() { }
public long getId()
{
return this.id;
}
public void addAssociated(AssociatedModel am)
{
am_collection.add(am);
}
}
AssociatedModel类
@Entity
@Table(name = "associated_model")
public class AssociatedModel
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
public AssociatedModel() { }
public long getId()
{
return this.id;
}
}
MainModel的最简单的jpa存储库
public interface MainModelDAO extends JpaRepository<MainModel, Long>
{
}
最后,控制器创建和保存AssociatedModel实例的方法
@RequestMapping("/url")
public String createAssociated(@RequestParam("id_mainmodel") long id_mainmodel, @RequestBody AssociatedModel newAm)
{
MainModel mm = MainModelDAOobject.findOne(id_mainmodel);// MainModelDAOobject - @Autowired
mm.addAssociated(newAm);
MainModelDAOobject.saveAndFlush(mm);
return String.valueOf(newAm.getId());// get Id of associated saved object
}
关联对象正确保存到数据库中,但getId()
方法允许此对象的 id 值始终零。如何正确获取保存的关联对象的ID?
答案 0 :(得分:1)
保存值后尝试调用MainModelDAOobject.flush()
,但在读取ID之前。
请参阅this answer以获取解释。
修改:尝试通过添加新行手动保存newAm
:
mm.addAssociated(newAm); // Existing line
newAm = MainModelDAOobject.save(newAm); // New line
MainModelDAOobject.save(mm); // Existing line
答案 1 :(得分:0)
你需要一个序列生成器:
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MainModel SequenceGenerator")
@SequenceGenerator(name = "MainModel SequenceGenerator", sequenceName = "MainModel Sequence", initialValue = SEQUENCE_INITIAL_VALUE, allocationSize = SEQUENCE_ALLOCATION_SIZE)
答案 2 :(得分:-1)
感谢 David Levesque 提供有用的建议。
问题解决如下:
需要AssotiatedModel的其他存储库
public interface AssotiatedModelDAO扩展了JpaRepository {}
然后手动保存关联对象:
mm.addAssociated(newAm);
newAm = AssotiatedModelDAOobject.save(newAm);
newAm = MainModelDAOobject.save(newAm)`;
MainModelDAOobject.save(毫米);