Dúvida sobre o Hibernate... (persistência)

1 resposta
JohannGomes

Olá, gostaria de saber se existe alguma forma de eu fazer com que um conjunto de dados seja sempre persistido ao carregar uma página, só que antes de persistir esses dados, o Hibernate deve verificar se eles já existem no banco de dados, se eles já existirem, deve ser feito apenas um update do mesmo ou nada (se ele não tiver mudado).

Da forma que estou fazendo eles sempre são salvos, trata-se de um programa que mantém salvos os últimos posts de uma página do facebook assim que é executado:

Código de Application.java (o controller do index)

@Transactional
    public static Result index() throws SQLException {
    	FacebookClient facebookClient = new DefaultFacebookClient(MY_ACCESS_TOKEN);
    	
    	String stream = String.format("select created_time, message, permalink, post_id from stream where source_id='%s' and actor_id='%s' LIMIT %s;", PAGE_ID, PAGE_ID, LIMIT_NUMBER_POSTS);
    	java.util.List<Stream> streamResult = facebookClient.executeFqlQuery(stream, Stream.class);

    	String postContents = "";
    	
    	for(Stream streamObj : streamResult){
    		//porque não usar gets? porque o play framework os gera em tempo de execução automaticamente
    		postContents += "\n\n\nPost message: " + streamObj.message + "\n";
    		postContents += "Created on: " + streamObj.created_time + "\n";
    		postContents += "Link: " + streamObj.permalink + "\n";
    		if( PERSIST_DATA ) {
    			EntityManager em = JPA.em();
    			em.persist(streamObj);
    		}

         return ok(postContents);
    }

Código de Stream.java (o model que desejo persistir)

@Entity
@Table(name = "stream")
public class Stream {
	  @Facebook
	  @Id
	  @Column(name = "post_id")
	  public String post_id;
	  
	  @Facebook
	  @Column(name = "created_time")
	  public String created_time;
  	  
  	  @Facebook
  	  @Column(name = "message")
  	  public String message;
  	  
  	  @Facebook 
  	  @Column(name = "permalink")
  	  public String permalink;

  	  @Override
	  public String toString() {
	    return String.format("%s, %s, %s, %s", created_time, message, permalink, post_id);
	  }
}

Abraço pessoal! Desde já agradeço.

1 Resposta

R

Se…

java.util.List<Stream> streamResult = facebookClient.executeFqlQuery(stream, Stream.class);

o metódo ‘executeFqlQuery’ do cliente ‘facebookClient’ retorna instacia de Stream persitida e não persistidas?
Então só verificar o se post_id(id) da Classe Stream está null… se tiver nulo é novo(persist)… se não é antigo(updade)… Ou crie outro médodo em facebookClient que receba o id de Stream que verifique se existe se há um registro com o id informado.

obs FacebookClient é classe sua ou de terceiros?

Criado 1 de junho de 2013
Ultima resposta 11 de jun. de 2013
Respostas 1
Participantes 2