2010-11-11 7 views
2

У меня есть отношение ManyToMany с составным ключом между пользователем и группой в JPA EclipseLink. Моя реализация выглядит следующим образом:Проблема с ManyToMany и JPA EclipseLink

Класс пользователя:

@Entity 
@Table(name="mbm_user") 
public class User extends CanAccessBook{ 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(nullable = false) 
private Long id; 

@OneToMany(mappedBy="user",cascade=CascadeType.PERSIST) 
private List<GroupMembership> groups = new ArrayList<GroupMembership>(); 

    /** 
    GETTER & SETTER 
    **/ 
} 

Группа Класс:

@Entity 
@Table(name="mbm_group") 
public class Group extends CanAccessBook{ 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(nullable = false) 
private Long id; 

@OneToMany(mappedBy="group", cascade=CascadeType.PERSIST) 
private List<GroupMembership> users = new ArrayList<GroupMembership>(); 

    /** 
    GETTER & SETTER 
    **/ 
} 

GroupMembership Класс:

@Entity 
@Table(name = "group_user") 
@IdClass(UserGroupPK.class) 
public class GroupMembership { 

@Id 
@ManyToOne 
@PrimaryKeyJoinColumn(name="USERID") 
private User user; 

@Id 
@ManyToOne 
@PrimaryKeyJoinColumn(name="GROUPID") 
private Group group; 

@Temporal(TemporalType.DATE) 
private Date joinedAt = new Date(); 

@Temporal(TemporalType.DATE) 
private Date validUntil; 

    /** 
    GETTER & SETTER 
    **/ 
} 

UserBookPK Класс:

public class UserBookPK{ 

@Id 
@Column(name="BOOKID") 
private Long book; 

@Id 
@Column(name="USERID") 
private Long user; 

public Long getBook() { 
    return book; 
} 

public void setBook(Long book) { 
    this.book = book; 
} 

public Long getUser() { 
    return user; 
} 

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

Мои JUnit тесты не отчет без ошибок, но если я проверить это на моем сервере Tomcat, я получаю следующие ошибки

Исключение [EclipseLink-59] (Eclipse, послесвечение услуги - 2.1.1.v20100817- r8050): org.eclipse.persistence.exceptions.DescriptorException Исключение Описание: переменная экземпляра [groupId] не определена в классе домена [de.kapieren.mbm.server.model.GroupMembership], или она недоступна. Внутренняя Исключение: java.lang.NoSuchFieldException: идентификатор_группы Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping [groupId-- > group_user.GROUPID] Descriptor: RelationalDescriptor (de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable (group_user)])

Исключение [EclipseLink-59] (Eclipse, Постоянство Услуги - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DescriptorException Исключение Описание: экземпляр переменная [идентификатор пользователя ] не определен в классе домена [de.kapieren.mbm.server.model.GroupMembership], или он недоступен. Внутренняя Исключение: java.lang.NoSuchFieldException: идентификатор пользователя Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping [userId-- > group_user.USERID] Descriptor: RelationalDescriptor (de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable (group_user)])

Исключение [EclipseLink-0] (Eclipse, Постоянство Услуги - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DescriptorException Исключение Описание: внутренняя ошибка доступа объект первичного ключа [202]. Внутренняя Исключение: java.lang.NoSuchFieldException: идентификатор_группы Descriptor: RelationalDescriptor (de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable (group_user)])

Что происходит здесь не так?

+0

Начальный совет: что происходит, когда вы меняете пользователя пользователя -> User userId ... –

+0

Для полноты вы можете разместить свой класс группы. –

+0

Класс группы все еще существует – LeonS

ответ

0

Я пробовал точно такой же код с помощью Windows-машины, и он работает без проблем. Я думаю, что проблема в JVM MAC OS (я работаю с Mac OS). Поэтому мне нужно продолжить работу над виртуальной машиной Windows. этот вопрос, как представляется, задокументирован EclipseLink (Исключение 59). Это очень плохо для меня, и я думаю, что это будет мой последний раз, когда я дал Java попробовать ...

1

Вы должны использовать @JoinColumn вместо @PrimaryKeyJoinColumn для @ManyToOnes.

+0

Не помогает, по-прежнему та же проблема :(Любопытно, что мои тесты JUnit в порядке, но с Tomcat эти Исключения выбрасываются. – LeonS

0

У вас есть класс UserBookPK, но он не упоминается нигде. Я предполагаю, что это должно быть UserGroupPK? В этом случае это неправильно. Поля должны быть экземплярами User и Group, для одного. Он должен быть Serializable (но не включать идентификатор версии по какой-либо причине).

Еще лучше, не используйте @IdClass. Это только для обратной совместимости. Поместите суррогатный ключ на GroupMemberShip и используйте это, чтобы связать все вместе. Или, если вы действительно хотите составной первичный ключ, перейдите на @EmbeddedId. Поскольку это всего лишь отношения, моделируемые как объекты, это имеет смысл.

Вам необязательно также отображать промежуточный класс, который иногда работает.