Ваш пользовательский конструктор выглядит так:
public User(Long id, String fName, String lName) {
this.id = id;
this.firstName = fName;
this.lastName = lName;
}
и вы используете его так:
User userObj = new User(shippingAddressId, "firstNameLiteral", "lastNameLiteral");
это означает, что вы устанавливаете идентификатор пользовательских объектов на идентификатор адреса доставки но вы на самом деле не устанавливаете объект адреса доставки в пользователе на что-либо.
Следующие шаги должны решить вашу проблему:
public class User {
// Add @GeneratedValue to your User#id (I think you don't need to set the strategy
// here, but not 100% sure)
@Id
@GeneratedValue
private Long id;
// ...
}
// Change User constructor like this
public User(Address shippingAddress, String fName, String lName) {
this.shippingAddress = shippingAddress;
this.firstName = fName;
this.lastName = lName;
}
public static void main( String[] args) {
Address shippingAddress = new Address("CityNameLiteral", "StreetNameLiteral");
Session session = DbOperations.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.persist(shippingAddress);
// Use the Adress object now
User userObj = new User(shippingAdress, "firstNameLiteral", "lastNameLiteral");
session.persist(userObj);
tx.commit();
session.close();
}
Если вы не уверены Я бы порекомендовал вам последовать этому примеру, хотя он предлагает решение с двумя таблицами: https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/