jpa एबीआई के साथ कईइंटरऑन मैपिंग के साथ एंबेडेड इडी का उपयोग करते समय डुप्लिकेट कॉलम




playframework playframework-2.0 (2)

मेरे पास "इवेंटकैकिन" नामक एक मॉडल है जिसमें एक "ईवेंट" और "उपयोगकर्ता" के लिए कई सारे मैपिंग हैं "ईवेंटकैकिन" तालिका का प्राथमिक कुंजी उपयोगकर्ता का आईडी और ईवेंट का आईडी है। मैं इसे अपने EventCheckin मॉडल में "एम्बेडेड आईडी" का उपयोग करने का प्रयास करने की कोशिश कर रहा हूं, लेकिन जब मैं एक ईवेंट काचुक सहेजने का प्रयास करता हूं तो यह उपयोगकर्ता_आईड और इवेंट_आईड को तालिका में दो बार दोबारा रखने की कोशिश करता है, जो स्पष्ट रूप से विफल रहता है:

Caused by: org.h2.jdbc.JdbcSQLException: Duplicate column name "USER_ID"; SQL statement:
insert into eventCheckin (event_id, user_id, latitude, longitude, user_id, event
_id) values (?,?,?,?,?,?) [42121-158]

इवेंटकैक्किन वर्ग:

@Entity
@Table(name="eventCheckin")
public class EventCheckin extends Model
{
    @EmbeddedId public CheckinId id;

    @MapsId("userId")
    @JoinColumn(name="user_id")
    @ManyToOne public User user;

    @MapsId("eventId")
    @JoinColumn(name="event_id")
    @ManyToOne public Event event;

    .....
}

चेकइन आईडी एम्बेडेड इड क्लास ::

@Embeddable 
public class CheckinId implements Serializable
{
    public Long eventId;  
    public String userId;
    .....
}

और EventCheckin के लिए मेरी डेटाबेस तालिका इस प्रकार परिभाषित की गई है:

create table eventCheckin (
    user_id                   varchar(255) not null,
    event_id                  bigint not null,
    latitude                  float,
    longitude                 float,
    constraint pk_eventCheckIn primary key (user_id,event_id),
    foreign key (user_id) references user (email),
    foreign key (event_id) references event (id)
);

यह त्रुटि इसलिए आती है क्योंकि कॉलम user_id और event_id को संमिश्र कुंजी द्वारा उपयोग किया जाता है और साथ ही वे @ManyToOne मैपिंग द्वारा उपयोग किया जाता है समाधान insertable = false, updatable = false attributes @Joincolumn annotaion को @Joincolumn लिए है। इस समाधान के लिए यहां कोड काम कर रहा है:

EventChekin.java:

@Entity
@Table(name="eventCheckin")
public class EventCheckin extends Model
{

    public EventCheckin() {
        id = new CheckinId();
    }

    @EmbeddedId public CheckinId id;

    @MapsId("userId")
    @JoinColumn(name="user_id", insertable = false, updatable = false)
    @ManyToOne private User user;

    @MapsId("eventId")
    @JoinColumn(name="event_id", insertable = false, updatable = false)
    @ManyToOne 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;
    }
}

ऐसा लगता है कि आप @MapsId और @EmbedbedId के माध्यम से ऐसा ही करने की कोशिश करते हैं। एक (कामकाजी) विकल्प आईडीक्लास के लिए जाना है (बराबर, हैशकोड, अतिरिक्त विशेषताओं आदि काट रहे हैं):

    @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;
    }