保存后获取关联对象的ID

时间:2014-01-29 16:01:44

标签: java spring-mvc jpa spring-data-jpa

有关联实体的简单模型:

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?

3 个答案:

答案 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 提供有用的建议。

问题解决如下:

  1. 需要AssotiatedModel的其他存储库

    public interface AssotiatedModelDAO扩展了JpaRepository {}

  2. 然后手动保存关联对象:

    mm.addAssociated(newAm);

    newAm = AssotiatedModelDAOobject.save(newAm);

    newAm = MainModelDAOobject.save(newAm)`;

    MainModelDAOobject.save(毫米);