2014-12-28 17 views
7

Ciao Sono nuovo a Sprig Data JPA e mi sto chiedendo anche se ho passato l'Id all'entità, i dati Spring jpa si stanno inserendo invece di unire. Ho pensato quando ho implementare l'interfaccia Persistable e implementare i due metodi:Spring Data Inserimento JPA invece di Aggiornamento

public Long getId(); 
public Boolean isNew(); 

che verrà automaticamente unire invece di persistere.

ho una classe di entità chiamata dell'utente come:

@Entity 
@Table(name = "T_USER") 
public class User implements Serializable, Persistable<Long> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "USER_ID") 
    private Long id; 

    @Column(name = "CREATION_TIME", nullable = false) 
    private Date creationTime; 

    @Column(name = "FIRST_NAME", nullable = false) 
    private String firstName; 

    @Column(name = "LAST_NAME", nullable = false) 
    private String lastName; 

    @Column(name = "MODIFICATION_TIME", nullable = false) 
    private Date modificationTime; 

e hanno un'altra classe

@Entity 
@Table(name = "T_USER_ROLE") 
public class UserRole implements Serializable, Persistable<Long> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long roleId; 

    @Column(name = "ROLE_NAME") 
    private String userRole; 
} 

Ho un repository personalizzato chiamato UserRepostory estende JpaReopistory. Sto colpendo il salvataggio per unire e persistono mentre vedo che l'implementazione dimostra che Spring Data Jpa utilizza due metodi per aggiornare o inserire.

@Repository 
public interface UserRepository extends JpaRepository<User, Long> { 
} 

Ho cercato di capire ma non ho avuto alcun indizio. Forse tu puoi aiutare i ragazzi .

+0

Non è necessario implementare l'interfaccia permanente. Basta usare il 'save' ereditato e Spring Data lo gestirà per te. –

risposta

20

Mi sono imbattuto in questo problema, tentato di implementare Persistable inutilmente, e quindi ho cercato nella fonte JPA di Spring Data. Non lo vedo necessariamente nel tuo codice di esempio, ma ho un campo @Version nella mia entità. Se esiste un campo @Version, Spring Data verifica il valore del valore per determinare se l'entità è nuova o meno. Se il campo @Version non è una primitiva ed è null, l'entità è considerata nuova.

Questo mi ha gettato a lungo nei miei test perché non stavo impostando il campo della versione nella mia rappresentazione ma solo sull'entità persistente. Inoltre non vedo questo documentato nei documenti Spring Data altrimenti utili (che è un altro problema ...).

La speranza che aiuta qualcuno!

+0

Sì, hai ragione.Ho avuto il campo Versione nell'entità. Non ho mai saputo che Spring Data JPA avrebbe cercato quel campo. –

+0

Ho esattamente lo stesso problema e non è per le annotazioni @Version ... – multiplayer1080

+0

Grazie per questa risposta mi sono imbattuto nello stesso problema! – JamesG

2

Per impostazione predefinita, Spring Data JPA ispeziona la proprietà identificatore dell'entità specificata. Se la proprietà dell'identificatore è null, l'entità verrà considerata come nuova, altrimenti come non nuova. E 'Id-Property inspectionReference

Se si utilizza Primavera JPA con EntityManeger chiamando .merge() aggiornerà il tuo entuty e inserirà .persist().

@PersistenceContext 
private EntityManager em; 

@Override 
@Transactional 
public User save(User user) { 

    if (user.getId() == null) { 
     em.persist(user); 
     return user; 
    } else { 
     return em.merge(user); 
    } 
} 

Non è necessario implementare l'interfaccia Persistable.

+0

Grazie @njjnex. Ma quando si utilizza l'interfaccia JpaRepository e si chiama il metodo di salvataggio dalla classe Service, si vede che internamente Spring Data JPA verifica se l'entità è nuova o meno. In questo modo, quando un'entità implementa l'interfaccia Persistabile di Spring, sostituisce due metodi: 1. Boolean isNew() e 2. Long getId(). Ma non sta funzionando. –

+2

Come ho già detto, sto entrando in Spring Data Jpa e in precedenza ho usato i propri livelli dao personalizzati. Ho fatto il modo in cui hai citato come sopra passando l'entityManager in implementazione dao. Funziona bene ma la mia domanda è perché non funziona nel contesto dei dati di Spring Jpa. –

Problemi correlati