Избыточный идентификатор таблицы с уникальным внешним ключом? - PullRequest
0 голосов
/ 13 января 2019

Я изучаю, как использовать Hibernate, и у меня есть вопрос, касающийся идентификаторов для таблиц, которые имеют отношение один к одному.

Есть две таблицы, Employee и Account, которые имеют отношение один к одному. Первичный ключ для Employee - это идентификатор сотрудника. Я хочу использовать этот идентификатор для Account и понимаю, что его можно определить как внешний ключ в таблице Account.

@Entity
@Table
public class Employee
{
    @Id
    private int employeeId;
}

@Entity
@Table
public class Account
{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int tempId;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "employeeId", referencedColumnName = "employeeId", nullable=false, insertable=false, updatable=false, foreignKey = @ForeignKey(name="FK_Account_Employee"))
    private Employee employee;
}

Обратите внимание, что Account имеет дополнительное поле id, которое мне не нужно, поскольку внешний ключ идентификатора сотрудника является уникальным. Если я удаляю tempId, тогда я получаю исключение во время выполнения.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: com.company.entity.Account

Можно ли объявить Account без этого дополнительного идентификатора?

1 Ответ

0 голосов
/ 14 января 2019

Возможно, вы захотите использовать аннотацию @PrimaryKeyJoinColumn. Он используется для хранения одного уникального ключа в отношениях «один к одному» и «многие к одному», который работает так же, как первичный и внешний ключи. Найдите документацию ниже:

https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

...