Как правильно сделать множество таблиц соединений в JPA? - PullRequest
3 голосов
/ 24 марта 2009

Мне нужно 3 объекта: Пользователь, Контракт (отношение между многими) и средний объект: UserContract (это необходимо для хранения некоторых полей).

То, что я хочу знать, - это правильный способ определения отношений между этими сущностями в JPA / EJB 3.0, чтобы все операции (сохраняются, удаляются и т. Д.) Были в порядке.

Например, я хочу создать пользователя и его контракты и упростить их сохранение.

В настоящее время у меня есть это: В User.java:

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<UserContract> userContract;

In Contract.java:

@OneToMany(mappedBy = "contract", fetch = FetchType.LAZY)
private Collection<UserContract> userContract;

И мой UserContract.java:

@Entity
public class UserContract {
@EmbeddedId
private UserContractPK userContractPK;

@ManyToOne(optional = false)
private User user;

@ManyToOne(optional = false)
private Contract contract;

И мой UserContractPK:

@Embeddable
public class UserContractPK implements Serializable {
@Column(nullable = false)
private long idContract;

@Column(nullable = false)
private String email;

Это лучший способ достичь моих целей?

1 Ответ

2 голосов
/ 26 марта 2009

Все выглядит правильно. Мой совет - использовать @MappedSuperclass поверх @EmbeddedId:

@MappedSuperclass
public abstract class ModelBaseRelationship implements Serializable {

@Embeddable
public static class Id implements Serializable {

    public Long entityId1;
    public Long entityId2;

    @Column(name = "ENTITY1_ID")
    public Long getEntityId1() {
        return entityId1;
    }

    @Column(name = "ENTITY2_ID")
    public Long getEntityId2() {
        return entityId2;
    }

    public Id() {
    }

    public Id(Long entityId1, Long entityId2) {
        this.entityId1 = entityId1;
        this.entityId2 = entityId2;
    }

   }

   protected Id id = new Id();

   @EmbeddedId
   public Id getId() {
        return id;
   }

   protected void setId(Id theId) {
        id = theId;
   }

 }

Я опустил очевидные конструкторы / сеттеры для удобства чтения. Тогда вы можете определить UserContract как

@Entity
@AttributeOverrides( {
        @AttributeOverride(name = "entityId1", column = @Column(name = "user_id")),
        @AttributeOverride(name = "entityId2", column = @Column(name = "contract_id"))
})
public class UserContract extends ModelBaseRelationship {

Таким образом, вы можете совместно использовать реализацию первичного ключа для других объединяемых объектов «многие ко многим», таких как UserContract.

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