Since nodes have no id on insert, you should just save the node twice.
node_save() initiates a database transaction, in which the changes are not yet written, but the id is already reserved (explaining your issues with not being able to save). You will have to await the database transaction before attempting to save the node again. Unfortunately there is no hook for this.
However, there is a workaround: drupal_register_shutdown_function(). This can be used to call an additional function at the end of the request.
You'll end up with a code like this:
function your_module_node_insert($node){
if($node->type == 'your_node'){
drupal_register_shutdown_function('_your_module_post_insert',$node);
}
}
function _your_module_post_insert($node) {
if ($node) {
$node->save();
}
}
Code comes originally from here: http://drupal.stackexchange.com/a/102185/9921https://drupal.stackexchange.com/a/102185/9921