2016-09-15 1 views
0

Я начинаю входить в мир 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 идентификатора.

+0

Вот где вы смотрите журнал поставщика JPA и видите вызванный SQL. –

+0

Как я могу это сделать? Я использую intelliJ. У меня есть файл persistence.xml, но я не вижу, куда идти оттуда – Ellone

+0

persistence.xml обычно указывает поставщика JPA. Независимо от того, делает он это или нет, вы можете легко определить, какой из них вы используете из CLASSPATH и класса экземпляра «emf». Итак, вы смотрите в документах для этого провайдера, а затем смотрите в журнал. aka «debugging» –

ответ

0

На самом деле, мне просто нужно было перезапустить сервер weblogic. Похоже, что при обновлении базы данных источник данных не динамически обновляется.

Смежные вопросы