2009-03-23 3 views
3

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

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

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

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

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

В 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; 

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

ответ

2

Все выглядит правильно. Мой совет заключается в использовании @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.