Я начинаю входить в мир Java, и у меня возникают проблемы, чтобы понять это.Поведение EntityManager.find с объектом, содержащим 2 id в качестве первичного ключа
Я использую JPA для взаимодействия с моей базой данных с JPQL.
У меня есть постоянный класс, как этот:
@Entity
@Table(name="C_A_T")
@NamedQuery(name="CAT.findAll", query="SELECT c FROM CAT c")
public class CAT implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private CATPK id;
private String offer;
@Temporal(TemporalType.DATE)
@Column(name="MODIF_DATE")
private Date modifDate;
public CAT() {}
public CATPK getId() {return id;}
public void setId(CATPK id) {this.id = id;}
public String getOffer() {return offer;}
public void setOffer(String offer) {this.offer = offer;}
public Date getModifDate() {return modifDate;}
public void setModifDate(Date modifDate) {this.modifDate= modifDate;}
/* ... */
}
Класс CATPK
представляет собой первичный ключ экземпляра CAT
:
@Embeddable
public class CATPKimplements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
@Column(name="ID_CAT")
private String idCAT;
@Column(name="ID_DEMANDE")
private String idDemande;
public CATPK() {}
public String getIdCAT() {return this.idCAT;}
public void setIdCAT(String idCAT) {this.idCat= idCat;}
public String getIdDemande() {return this.idDemande;}
public void setIdDemande(String idDemande) {this.idDemande = idDemande;}
/* ...*/
}
Так поясню, то primay ключ из 2 другой идентификатор.
Теперь, иногда, прежде чем вставлять CAT
в моей базе данных я проверил, если он еще не в C_A_T
таблице:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("cie");
em = emf.createEntityManager();
em.getTransaction().begin();
// inCAT is an instance of CAT on which there is a complete primary key CATPK (made of 2 id)
CAT CATinDB = em.find(CAT.class, inCAT.getId());
if (null == CATinDB)
em.persist(inCAT); // CAT created
em.getTransaction().commit();
em.close();
Теперь проблема заключается в том, что линия em.find(CAT.class, inCAT.getId());
не возвращается null
, когда он должен.
Например, CATinDB может содержать строку, когда у меня фактически нет строк справа idCAT
и idDemande
.
Так будет find
считать, что он найден только с одним идентификатором catPK
?
В конце концов, я изменил строку:
if (null == CATinDB)
в:
if (null == CATinDB || CATinDB.getId().getIdCAT() != inCAT.getId().getIdCAT() || CATinDB.getId().getIdDemande() != inCAT.getId().getIdDemande())
Не совсем уверен, почему find
не возвращалось нуля, когда у меня не было никаких записей, соответствующих 2 идентификатора.
Вот где вы смотрите журнал поставщика JPA и видите вызванный SQL. –
Как я могу это сделать? Я использую intelliJ. У меня есть файл persistence.xml, но я не вижу, куда идти оттуда – Ellone
persistence.xml обычно указывает поставщика JPA. Независимо от того, делает он это или нет, вы можете легко определить, какой из них вы используете из CLASSPATH и класса экземпляра «emf». Итак, вы смотрите в документах для этого провайдера, а затем смотрите в журнал. aka «debugging» –