Hi,
You don't need to set product_parent_id in each variant. However, when calling the updateCharacteristics function, you need to provide the product_id of the product in the second parameter. Also, you should set the third parameter to 2.
The call to updateCharacteristics in the save function is used to generate the link between the product and the characteristics, as well as the link between the product and the default value of each characteristic, so it's not a good example of how to call updateCharacteristics to generate the variants of a product selectively.
I would rather recommend looking at the populateVariant function. That's the function called by HikaShop when you use the "add variants" button and you select the characteristics and the values for which you want the variants to be generated. In it, you can see that it does two things before calling updateCharacteristics. First, it fills $elem->oldCharacteristics with the result of a call to getProductCharacteristics. This provide the data of the characteristics linked to the product. Second, it fills the $elem->characteristics array with objects, one per characteristic, and in each object, an array of values in the values attribute.
I think this fits a lot better to what you're trying to do.
Note that this will basically create the variant entry in the hikashop_product table, and the links between each variant and its corresponding value for each characteristic in the hikashop_variant table. Then, you still need to save each variant individually if you wish to provide data for each variant with the save function.