2016-08-17 2 views
0

나는 새로운 사용자 (entity1)를 만들려고하고 필요 클래스 변수로.무엇 최대 절전/JPA 주석은

내 사용자 개체를 만들 때이 사용자가 그룹 n의 구성원이 될 것이라고 말하고 싶습니다. (id (1,2,3,4,5,6 ...)로 연결된 미리 정의 된 사용자가 있습니다.) 각 그룹은 테이블의 일부 관련 데이터가 다음과 같이 내 사용자 개체를 만들 때마다

,..

User user = new User(); 
user.setActive(1); 
user.setCrby("me"); 
user.setUsername("username"); 
user.setCrdate("2016-06-20 12:42:53.610"); 
user.setCrwsref("..."); 
user.setModby("..."); 
user.setModdate("2016-06-20 12:42:53.610"); 
user.setModswref(".."); 
user.setBackground("Y"); 
user.setPassword("password"); 
user.setFullName("me"); 

Group group = new Group(); 
group.setId(1); 

Group group2 = new Group(); 
group2.setId(2); 

Set<Group> sets = new HashSet<Group>(); 
sets.add(group); 
sets.add(group2); 

user.setGroups(sets); 

userDao.addUser(user); 

을 나는 특정 열이 null이 될 수 없음을 말해 오류가 점점 계속을 실제로 일이 원하는 것은 여기에 그룹 테이블에 삽입을 수행하는 것이 아니라 그룹 테이블의 행에 사용자를 연관시키는 것입니다. 수정되는 그룹 테이블의 열을 방지 할 수있는 특별한 방법이 있습니까? 내가 링크 테이블 사이의 매핑을 수정할 필요가 있다고 생각 -이 훨씬 POJO를가

@Entity 
@Table(name = "group") 
public class Group 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 
지금

사용자

@Entity 
@Table(name = "user") 
public class User 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @Column(name = "username") 
    private String username; 

    @Column(name = "password") 
    private String password; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "zmember", joinColumns = {@JoinColumn(name = "username")}, inverseJoinColumns = {@JoinColumn(name = "id")}) 
    private Set<Group> groups = new HashSet<Group>(0); 

회원 링크 테이블

@Entity 
@Table(name = "member") 
public class Member implements Serializable 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @Id 
    @Column(name = "sgpid") 
    private int sgpid; 

    @Column(name = "username") 
    private String memberUsername; 

그룹을 연결하는 방법입니다

링크 구성원 테이블에 연결이 없으므로 이상적으로 사용자가 그룹 집합이 아닌 구성원 개체 집합?

덕분에 -

+0

당신이 최대 절전 모드 인 경우, 방법은 것 당신은'username' 문자열을' User'와'Group'에 정수'id'가 있습니까? 'Member'는 어떤 경우에도 둘 다와 관련이 없다는 것에주의하십시오. 적어도 Hibernate의 관점은 아닙니다. 당신은'User'가'Member'의 집합을 가지기를 원할 것입니다. (그것들은'User'에 대한 참조를 가지고 관계의 소유자입니다.)'Member'는'Group'과'ManyToOne' 관계를가집니다. . – Thomas

+0

"멤버"는 다른 개체와 아무 관계가 없으므로 "링크 테이블"이 아닙니다! –

답변

0

그룹에 대한 사용자의 관계는 본질적으로 ManyToMany입니다. 당신은 이것을 @ManyToMany 주석을 사용하여 모델링 할 수 있지만,이 접근법의 단점은 'date_joined'와 같은 조인 테이블에 그룹에 대한 추가 정보를 저장할 수 없다는 것입니다. 당신이 엔티티 회원 가입이 필요하지 않을 및 사용자에 대한 관계의 모습이 방법을 사용 https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#ManyToMany

:

참조 @ManyToMany를 사용하여

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinTable(name = "zmember", joinColumns = {@JoinColumn(name = "member_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "group_id", referencedColumnName = "id")}) 
private Set<Group> groups = new HashSet<Group>(0); 

대안은 엔티티에 참여 사용하는 것입니다 회원 (선박). 이렇게하면 Join 엔티티에 추가 필드 매핑을 정의하여 관계에 대한 추가 데이터를 저장할 수 있습니다.

이 경우에 매핑이 보일 것 같은 :

사용자 :

public class User{ 
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<Membership> memberships = new HashSet<Membership>(0); 

    //if required, you can 'hide' the join entity from client code by  
    //encapsulating add remove operations etc. 

    public void addToGroup(Group group){ 
     Membership membershup = new Membership(); 
     membership.setUser(this); 
     membership.setGroup(group); 
     memberships.add(membership); 
    ) 

    public Set<Groupp> getGroups(){ 
     //iterate memberships and build collection of groups 
    } 
} 

회원 :

public class Membership{ 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private Member member; 

    @ManyToOne 
    @JoinColumn(name = "group_id") 
    private Group group; 
} 

그룹 :

@Entity 
@Table(name = "group") 
public class Group 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 

    @OneToMany(mappedBy = "group", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<Membership> memberships = new HashSet<Membership>(0); 
}