Колонка, указанная дважды с помощью EntityManager

Я пытаюсь сохранить сущность, которая имеет составной первичный ключ, но я получаю ошибку:

12:59:48,221 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-56) SQL Error: 1110, SQLState: 42000

12:59:48,221 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-56) Column 'SENDERID' specified twice

Я использую EntityManager поэтому я не знаю, где дважды 'SENDERID' SENDERID"?

Это все соответствующие классы:

Веб-сервис:

@Path("friendservice")
public class FriendWebService {

 @EJB
 private FriendrequestFacade friendRequestFacade;

 @GET
 @Path("friendrequest")
 @Produces(MediaType.TEXT_PLAIN)
 public String insertFriendRequest(
 @Context HttpServletRequest request){
 String result = "false";
 User user = (User) request.getSession().getAttribute("user");
 User otherUser = (User) request.getSession().getAttribute("profileuser");
 if((user != null) && (otherUser != null)){
 if(user.getId() != otherUser.getId()){
 System.out.println("Both users are alive.");
 if(friendRequestFacade.insertFriendRequest(user, otherUser))
 result = "true";
 }
 }
 return result;
 } 
}

Фасад:

@Stateless
public class FriendrequestFacade extends AbstractFacade<friendrequest> {
 @PersistenceContext(unitName = "FakebookPU")
 private EntityManager em;

 @Override
 protected EntityManager getEntityManager() {
 return em;
 }

 public FriendrequestFacade() {
 super(Friendrequest.class);
 }

 public boolean insertFriendRequest(User user, User otherUser){
 Friendrequest fr = new Friendrequest();
 FriendrequestPK frPK = new FriendrequestPK();
 frPK.setSenderid(user.getId());
 frPK.setReceiverid(otherUser.getId());
 fr.setId(frPK);
 em.clear();
 em.persist(fr);
 return true; 
 }
}
</friendrequest>

Сущность:

@Entity
@XmlRootElement
@Table(name="FRIENDREQUEST")
@NamedQuery(name="Friendrequest.findAll", query="SELECT f FROM Friendrequest f")
public class Friendrequest implements Serializable {
 private static final long serialVersionUID = 1L;

 @EmbeddedId
 private FriendrequestPK id;

 @Temporal(TemporalType.TIMESTAMP)
 private Date senddate;

 //bi-directional many-to-one association to User
 @ManyToOne
 @JoinColumn(name="SENDERID")
 private User user1;

 //bi-directional many-to-one association to User
 @ManyToOne
 @JoinColumn(name="RECEIVERID")
 private User user2;

 public Friendrequest() {}

 public FriendrequestPK getId() {
 return this.id;
 }

 public void setId(FriendrequestPK id) {
 this.id = id;
 }

 public Date getSenddate() {
 return this.senddate;
 }

 public void setSenddate(Date senddate) {
 this.senddate = senddate;
 }

 public User getUser1() {
 return this.user1;
 }

 public void setUser1(User user1) {
 this.user1 = user1;
 }

 public User getUser2() {
 return this.user2;
 }

 public void setUser2(User user2) {
 this.user2 = user2;
 }

}

Композитный ключ:

@Embeddable
public class FriendrequestPK implements Serializable {
 //default serial version id, required for serializable classes.
 private static final long serialVersionUID = 1L;

 @Column(insertable=false, updatable=false)
 private int senderid;

 @Column(insertable=false, updatable=false)
 private int receiverid;

 public FriendrequestPK() {}

 public FriendrequestPK(int senderid, int receiverid){
 this.senderid = senderid;
 this.receiverid = receiverid;
 }

 public int getSenderid() {
 return this.senderid;
 }

 public void setSenderid(int senderid) {
 this.senderid = senderid;
 }

 public int getReceiverid() {
 return this.receiverid;
 }

 public void setReceiverid(int receiverid) {
 this.receiverid = receiverid;
 }
}

Что я делаю не так?

1 ответ

Прежде всего, позвольте мне пояснить, что я редко использую @EmbeddedId чтобы я мог что-то упустить. При этом сообщается, что ошибка говорит вам, что столбец SENDERID указан дважды: первый раз в вашей сущности, а затем в составном ключе. То же самое, вероятно, происходит и с RECEIVERID.

сущность

public class Friendrequest implements Serializable {
 ...
 @EmbeddedId
 private FriendrequestPK id;

 @ManyToOne
 @JoinColumn(name="SENDERID") // Column = SENDERID
 private User user1;

 @ManyToOne
 @JoinColumn(name="RECEIVERID") // Column = RECEIVERID
 private User user2;
 ...
}

Композитный ключ

public class FriendrequestPK implements Serializable {
 ...
 @Column(insertable=false, updatable=false)
 private int senderid; // Column = SENDERID

 @Column(insertable=false, updatable=false)
 private int receiverid; // Column = RECEIVERID
 ...
}

В соответствии с разделом свойств идентификатора Mapping в справочном руководстве Hibernate Annotations сопоставление объектов должно выполняться с @MapsId аннотации @MapsId:

public class Friendrequest implements Serializable {
 ...
 @EmbeddedId
 private FriendrequestPK id;

 @MapsId("senderid") // senderid = Field in FriendrequestPK class
 @ManyToOne
 private User user1;

 @MapsId("receiverid") // receiverid = Field in FriendrequestPK class
 @ManyToOne
 private User user2;
 ...
}

licensed under cc by-sa 3.0 with attribution.