Проблема в том, что JPA по умолчанию не разрешает правильные аннотации для двунаправленных, общих ключей, отношений один-к-одному. Hibernate имеет идеальную конструкцию как раз для этого, но, пожалуйста, обратите внимание на порядок, а также на конкретные параметры аннотаций (вы также можете прочитать ссылку на hibernate, но их пример не будет работать, если вы предварительно не установите предварительно зависимый объект, Избегайте использования метода ниже - который в основном сохраняет оба объекта за один раз).
В этом примере каждое задание обрабатывает сообщение. Job - это «родитель», а message - это зависимый объект. Первичным ключом сообщения будет идентификатор задания (для исключения одного дополнительного столбца в таблице сообщений. Вы также можете создать идентификатор в таблице сообщений, если вам нужно использовать сообщение вне области задания, используя ту же настройку, что и ниже) , Когда задание создано и сообщение прикреплено, hibernate автоматически сохранит оба объекта при вызове jobDao.save.
@Entity
@Table
public class Job implements Serializable{
private Long id;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToOne(cascade = CascadeType.ALL, mappedBy = "job")
public Message getMessage() {
return message;
}
public void setMessage(Message message) {
this.message = message;
message.setJob(this);
}
}
А теперь зависимое сообщение:
@Entity
@Table
public abstract class Message implements Serializable {
private Job job;
@Id
@GeneratedValue(generator = "foreign")
@GenericGenerator(
name = "foreign",
strategy = "foreign",
parameters = {@org.hibernate.annotations.Parameter(name = "property", value = "job")})
@OneToOne(optional = false, cascade = CascadeType.ALL)
public Job getJob() {
return job;
}
public void setJob(Job job) {
this.job = job;
}
}