I have a model called \"EventCheckin\" which has a ManyToOne mapping to an \"Event\" and a \"User\". The PrimaryKey of the \"EventCheckin\" table is the id of the user and the i
This error occurs because columns user_id
and event_id
are used by composite key and at the same time they are used by @ManyToOne
mappings. The solution is to add insertable = false, updatable = false
attributes to @Joincolumn
annotaion. Here is working code for this solution:
EventChekin.java:
@Entity
@Table(name="eventCheckin")
public class EventCheckin extends Model {
public EventCheckin() {
id = new CheckinId();
}
@EmbeddedId
public CheckinId id;
@ManyToOne
@MapsId("userId")
@JoinColumn(name="user_id", insertable = false, updatable = false)
private User user;
@ManyToOne
@MapsId("eventId")
@JoinColumn(name="event_id", insertable = false, updatable = false)
private Event event;
public void setUser(User aUser) {
user = aUser;
id.userId = aUser.getId();
}
public void setEvent(Event aEvent) {
event = aEvent;
id.eventId = aEvent.getId();
}
}
Checkin.java
@Embeddable
public class CheckinId implements Serializable {
public Long eventId;
public String userId;
@Override
public int hashCode() {
return eventId.intValue() + userId.length();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
CheckinId c = (CheckinId)obj;
if(c==null)
return false;
if (c.eventId.equals(eventId) && c.userId.equals(userId)) {
return true;
}
return false;
}
}
It looks like you try to do same thing via @MapsId and @EmbeddedId. One (working) option is to go for IdClass (equals, hashcode, extra attributes etc are cut away):
@Entity
public class User {
@Id public String id;
}
@Entity
public class Event {
@Id public long id;
}
public class CheckinId implements Serializable {
public Long event;
public String user;
}
@Entity
@IdClass(CheckinId.class)
@Table(name="eventCheckin")
public class EventCheckin {
@Id
@JoinColumn(name="user_id")
@ManyToOne public User user;
@Id
@JoinColumn(name="event_id")
@ManyToOne public Event event;
}