Внешний ключ гибернации как часть первичного ключа - PullRequest
9 голосов
/ 22 августа 2011


Я должен работать с Hibernate и не очень уверен, как решить эту проблему, у меня есть 2 таблицы с отношением 1..n, как это:

-------
TABLE_A
-------
first_id (pk)
second_id (pk)
[other fields]

-------
TABLE_B
-------
first_id (pk)(fk TABLE_A.first_id)
second_id (pk)(fk TABLE_A.second_id)
third_id (pk)
[other fields]

Как можноЯ управляю этим с Hibernate ???

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

Ответы [ 3 ]

15 голосов
/ 22 августа 2011

В справочной документации Hibernate есть пример, который полностью аналогичен вашему случаю. Прямо перед этим примером вы найдете объяснения. Вот пример, который соответствует вашей проблеме (пользователь - таблица A, а клиент - таблица B):

@Entity
class Customer {
   @EmbeddedId CustomerId id;
   boolean preferredCustomer;

   @MapsId("userId")
   @JoinColumns({
      @JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"),
      @JoinColumn(name="userlastname_fk", referencedColumnName="lastName")
   })
   @OneToOne User user;
}

@Embeddable
class CustomerId implements Serializable {
   UserId userId;
   String customerNumber;

   //implements equals and hashCode
}

@Entity 
class User {
   @EmbeddedId UserId id;
   Integer age;
}

@Embeddable
class UserId implements Serializable {
   String firstName;
   String lastName;

   //implements equals and hashCode
}

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

3 голосов
/ 22 августа 2011

Используйте @PrimaryKeyJoinColumn и @PrimaryKeyJoinColumns аннотации. От Hibernate руководство :

В аннотации @PrimaryKeyJoinColumn сказано, что первичный ключ объекта используется в качестве значения внешнего ключа для ассоциированного объекта.

0 голосов
/ 17 мая 2017
public class User implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 5478661842746845130L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
}
@Entity
public class Author {

    @Id
    @Column(name = "AUTHOR_ID", nullable = false)
    private int authorId;
    @Column(name = "ENABLED", nullable = false, length = 1)
    private boolean enabled;

    @OneToOne
    @MapsId
    @JoinColumn(name = "AUTHOR_ID", referencedColumnName = "ID", nullable = false, insertable = false, updatable = false)
    User user;

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...