Создание первичного ключа таким же, как внешний ключ в Hibernate сущности - PullRequest
3 голосов
/ 02 мая 2020

Я новичок в Hibernate. Я работаю над двумя объектами следующим образом:

Объект 1 выглядит следующим образом:

@Entity
@Table(name = "vm_user")
public class VmUser implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "created_by")
    private String createdBy;

    @Column(name = "last_modified_by")
    private String lastModifiedBy;

    @Column(name = "created_date")
    private Instant createdDate;

    @Column(name = "last_modified_date")
    private Instant lastModifiedDate;

    @OneToOne
    @JoinColumn(unique = true)
    private User user;             <--- HOW WILL I DENOTE THIS PRIMARY KEY OF VMUSER ENTITY ?

В соответствующей таблице в mysql, т. Е. vm_user, user_id является как первичным ключом, так и внешним ключом, который ссылается на идентификатор user таблицы, связанной с User сущностью.

Сущность 2 выглядит следующим образом:

@Entity
@Table(name = "my_entity")
public class MyEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "created_by")
    private String createdBy;

    @Column(name = "last_modified_by")
    private String lastModifiedBy;

    @Column(name = "created_date")
    private Instant createdDate;

    @Column(name = "last_modified_date")
    private Instant lastModifiedDate;

    @ManyToOne
    private A a;

    @OneToOne
    @JoinColumn(unique = true)
    private B b;

В связанной таблице в mysql, то есть my_entity, первичный ключ является комбинацией id of a и id of b. Я не понимаю, как обозначить это в сущности Hibernate MyEntity.

Относительно того же, я прошел несколько сообщений: Внешний ключ Hibernate как часть первичного ключа и JPA & Hibernate - составной первичный ключ с внешним ключом , но не понимаете, как это сделать?

Ответы [ 3 ]

4 голосов
/ 02 мая 2020

Вам нужно использовать @EmbeddedId и @MapsId,

@Entity
@Table(name = "vm_user")
public class VmUser implements Serializable {
   @Id
    @Column(name = "user_id")    
    private Integer id;

    @MapsId("user_id")
    @OneToOne
    private User user;  
}

Вы можете сделать то же самое для MyEntity, как показано ниже,

@Embeddable
class BKey {
  private int aId;
  private int bId;
}


@Entity
@Table(name = "my_entity")
public class MyEntity implements Serializable {

    @EmbeddedId
    private BKey primaryKey;

    @MapsId("aId")
    @ManyToOne
    private A a;

    @MapsId("bId")
    @OneToOne
    @JoinColumn(unique = true)
    private B b;
}
4 голосов
/ 02 мая 2020

Решение - @MapsId

Например

@Entity
@Table(name = "vm_user")
public class VmUser implements Serializable {

    @Id
    @Column(name = "user_id")    
    private Integer id;

    @MapsId
    @OneToOne
    private User user;  

Вы также можете удалить @JoinColumn(unique = true), поскольку @Id уже делает его уникальным.

public class MyEntityPk implements Serializable {

   private Integer aId;
   private Integer bId;

   // IMPORTANT: Override equals() and hashCode()
}


@IdClass(MyEntityPk.class)
@Entity
@Table(name = "my_entity")
public class MyEntity implements Serializable {

    @Id
    private Integer aId;
    @Id
    private Integer bId;

    @MapsId("aId")
    @ManyToOne
    private A a;

    @MapsId("bId")
    @OneToOne
    private B b;

Дополнительную информацию можно найти в документации по Hibernate https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#identifiers - получено

0 голосов
/ 02 мая 2020

VM Пользователи класса

public class VmUser implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

@OneToOne
@JoinColumn(name="ID")
private Users user;

Пользователи класса

public class Users implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

@OneToOne(mappedBy="user")
private VmUser vmUser;

A класса

@Entity
public class A implements Serializable {

@Id
private long id;

@OneToMany(mappedBy="a")
private List<MyEntity> myEntitys;

B Класс

@Entity
public class B implements Serializable {

@Id
private long id;

@OneToMany(mappedBy="b")
private List<MyEntity> myEntitys;

Класс MyEntity

@Entity
public class MyEntity implements Serializable {
private static final long serialVersionUID = 1L;

@EmbeddedId
private MyEntityPK id;


@ManyToOne
@JoinColumn(name="ID1")
private A a;

@ManyToOne
@JoinColumn(name="ID2")
private B b;

Класс MyEntityPK

@Embeddable
public class MyEntityPK implements Serializable {

@Column(insertable=false, updatable=false)
private long id1;

@Column(insertable=false, updatable=false)
private long id2;
...