HIBERNATE + alterar somente uma coluna

4 respostas
nadasei

Olá pessoal.

Tenho um tabela com 4 colunas. Preencho 3 delas com dados simultaneamente.
Abro um outra seção e tento persistir dados na coluna que faltou, porém, os dados ficam assim conforme figura

+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | | 5000 |
| 31 | John | | 10000 |
+----+------------+-----------+--------+

Ao invés dos dados irem pro inicio e substituirem o espaço em branco, ficando assim

+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | Ali | 5000 |
| 31 | John | Paul | 10000 |
+----+------------+-----------+--------+

eles ficam assim:

+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 29 | Zara | | 5000 |
| 31 | John | | 10000 |
| 31 | John | Ali | 10000 |
| 31 | John | Pau | 10000 |
+----+------------+-----------+--------+

repetindo as ultimas colunas e colocando na sequencia, ao invés de começar do inicio....

session = factory.openSession();
		
					tx = session.beginTransaction();
					
					insertData.setAng_pmu(Ang_pmu.get(i1));

					session.save(insertData);
					session.flush(); 
					tx.commit();

e o xml

<session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.url">jdbc:postgresql://localhost:5432/postgres</property>
        <property name="connection.username">postgres</property>
        <property name="connection.password">123456</property>
		<property name="hibernate.default_schema">Estimador</property>
 		<property name="current_session_context_class">thread</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">2</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
 
        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>


        <mapping resource="escrevebanco.cfg.xml"/>

    </session-factory>

alguma ideia?

4 Respostas

vinicius8891

Quando for persistir session.save(Objeto atual) verifique se o ID do objeto existe, se sim, chame session.update(Objeto atualizado), isso se sua PK for auto increment, se não for, pode usar o método session.saveOrUpdate(Objeto atualizado)

nadasei

Repare nas linhas 450 a 475, onde persisto no banco, e depois volto a persistir!
COloquei o update, mas ele atualiza em cima dos dados já persistidos…que cagada estou fazendo?

package criaBanco;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;


//banco de dados
import criaBanco.DBAR;
import criaBanco.DLIN;
import criaBanco.DbarDAO;
import criaBanco.DlinDAO;





//extrai do TXT caso não tenha no Banco
public class ExtrairDados {

	
	ArrayList <Integer> Num            = new ArrayList <Integer>();  
	/**locais para cálculo dos parâmetros que não são
	fornecidos no banco de dados
	*/
	ArrayList <Integer> De            = new ArrayList <Integer>();    
	ArrayList <Integer> Para          = new ArrayList <Integer>();    
	ArrayList <Integer> Tipo          = new ArrayList <Integer>(); 
	ArrayList <Double>  I_pmu_km      = new ArrayList <Double>(); 
	ArrayList <Double>  I_pmu_mk      = new ArrayList <Double>(); 
	ArrayList <Double>  I_ang_pmu_km  = new ArrayList <Double>(); 
	ArrayList <Double>  I_ang_pmu_mk  = new ArrayList <Double>(); 
	ArrayList <Double>  Pkm           = new ArrayList <Double>(); 
	ArrayList <Double>  Pmk           = new ArrayList <Double>(); 
	ArrayList <Double>  Qkm           = new ArrayList <Double>(); 
	ArrayList <Double>  Qmk           = new ArrayList <Double>(); 
	ArrayList <Double>  V             = new ArrayList <Double>(); 
	ArrayList <Double>  Angfc         = new ArrayList <Double>(); 
	ArrayList <Double>  Ang_pmu       = new ArrayList <Double>(); 
	
	/**Converte String para Inteiro, verificando casos em que o arquivo
	 * txt não tem valores
	 * 
	 */
	public int StrToInt(String s)
	{
		int i = 0;
		String s2;

		s2 = s.trim();
		//trata quando tem valor em branco no arquivo txt
		if( s2.isEmpty()|| s2.length() == 0){
			i = 0;
		}else{
			i = Integer.parseInt(s2,10);
		}
		return i;	
	}

	/**Converte String para Double, verificando casos em que o arquivo
	 * txt não tem valores
	 */
	public  double StrToDouble(String s)
	{
		double d = 0;
		//trata quando tem valor em branco no arquivo txt
		String s2;

		s2 = s.trim();
		if( s2.isEmpty()|| s2.length() == 0){
			d = 0;
		}else{
			d = Double.parseDouble(s2);
		}
		return d;	
	}

	//instancia 
	DBAR dbar = new DBAR();
	DLIN dlin = new DLIN();
	Integer NBAR = 0;
	Integer NLIN = 0;

    

	public ExtrairDados(File selFile) throws Exception {
		// TODO Auto-generated constructor stub
		
	  
	    
	
		
		String str = "";
		String str2 = "";
	//	String str3 = "";

		

		

		FileReader fr = new FileReader(selFile);
		BufferedReader reader = new BufferedReader(fr);


		do{
			str = reader.readLine();
			//getline(in,str);  // armazena primeira linha em str;

			str2 = str.substring (0,3);//copia os 5 primeiros caracteres da string para

			/*============================================================*/
			/*           L E I T U R A   D A D O S  D E  B A R R A        */
			/*============================================================*/
			
			Session session = null ;
			Transaction tx = null;
			if(str2.compareTo("(Nu")==0) //compara conteudo de buffer com (Num);
			{
				/*============================================================*/
				/*  Este laço extrai:                                         */
				/* 1- dados base de barra                                     */
				/* 2- dados para estimação de estado                          */
				/* 3- dados das medidas fasoriais sincronizadas               */
				/*============================================================*/

				str = reader.readLine();  // armazena primeira linha em str;
				int i=0;
			

				DbarDAO insertData = new DbarDAO();
				// aqui nós lemos as configurações do arquivo hibernate.cfg.xml
				// e deixamos o Hibernate pronto para trabalhar
				SessionFactory factory = new Configuration().addAnnotatedClass(DbarDAO.class).configure("escrevebanco.cfg.xml").buildSessionFactory(); // deve ser instanciado somente uma vez

				
				do{ //leia e armazene os dados de barra enquanto não encontrar o fim dos dados de barra

					session = factory.openSession();
					// inicia uma transação
					tx = session.beginTransaction();

					
					//inserindo no BANCO dados para estimação de estado.
					//insertData.setNum(dbar.getNum().get(i));
						
					/*============================================================*/
					/*        E X T R A Ç Ã O  D O S  D A D O S  B A S E          */
					/*============================================================*/

					/** N Ú M E R O  Número de Identificação da Barra CA */

					// ponteiro_para_objeto_do tipo DBAR->VETOR NA CLASSE.armazena no final
					//(str.substring( inicio da leitura, número de caracteres a serem lidos))

				
					
					
					insertData.setNum(StrToInt(str.substring(0,5)));
					Num.add(StrToInt(str.substring(0,5)));
				    NBAR++;
					//dbar.Num(StrToInt(str.substring(0,5)));



					/**O P E R A Ç Ã O
				A ou 0 = adição de dados de barra
				E ou 1 = eliminação de dados de barra
				M ou 2 = modificação de dados de barra
				DEFAULT -> A
					 */


					//dbar.setOperacao(StrToInt(str.substring (5,6))); 


					/**E S T A D O 
				L - se a barra estiver em operação
				D - se a barra circuito estiver fora de operação (desligado)
				DEFAULT -> L
					 */

					//dbar.setEstado(str.substring (6,7));


					/**T I P O  D E  B A R R A
				0 - barra de carga (PQ - Injeções de Potência ativa e reativa fixas)
				1 - barra de tensão regulada (PV - Injeção de potência ativa e Magnitude de tensão fixas)
				2 - barra de referência (Vteta - Magnitude de tensão e ângulo de fase fixo)
				3 - barra de carga com limite de tensão (PQ - Injeções de potências ativa e reativa fixas
				enquanto a magnitude de tensão permanecer entre os valores limites)
				DEFAULT -> 0
					 */

					insertData.setTipo(StrToInt(str.substring (7,8)));



					/** G R U P O  B A S E  D E  T E N S Ã O
				Identificador de Grupo Base de Tensão ao qual pertence a barra CA, composto
				por até dois caracteres do tipo digito (0 a 9) ou caracter (A a Z), conforme definido 
				no código de execução DGBT (AnaRede-CEPEL). Os valores associados aos Grupos Base de Tensão
				são definidos no código de execução DGBT. Os grupos não definidos terão valor igual a 1[kV]
				DEFAULT -> 0
					 */
					//dbar.setGb(StrToInt(str.substring (8,9)));


					/**N O M E  D A  B A R R A
				Definição alfanumérica da barra
					 */
		
					insertData.setNome(str.substring (10,21));


					/**G R U P O  L I M I T E  D E  T E N S Ã O
				Identificador do grupo limite de tensão ao qual pertence a barra CA, 
				composto por até dois caracteres do tipo dígito (0 a 9) ou caracter (A a Z).
				Os grupos que não forem definidos terão valores limites de tensão mínimo e máximo iguais a 0,8 e 1,2 pu
				DEFAULT -> 0
					 */

					//dbar.setGl(StrToInt(str.substring (22,23)));

					/**T E N S Ã O
				Valor inicial da magnitude da tensão em pu. Para barra de tensão controlada, remotamente ou não,
				por geração de potência reativa ou por variação de tap de transformador, este campo deve ser preenchido 
				com o valor da magnitude da tensão a ser mantido constante. Ponto decimal implícito entre as colunas
				22 e 23.
				DEFAULT -> 1.0
					 */

					insertData.setVfc((StrToDouble(str.substring (24,28)))/1000);
					


					/**Â N G U L O
				Ângulo de fase inicial da tensão da barra, em graus
				DEFAULT -> 0
					 */

					
					insertData.setAngfc(Math.toRadians(StrToDouble(str.substring (29,32))));
					Angfc.add(Math.toRadians(StrToDouble(str.substring (29,32))));

					
					/**G E R A Ç Ã O  A T I V A
				Valor de geração de potência ativa na barra, em MW. 
				Este campo define o ponto base de operação sobre o qual
				as ações de controle são executadas de modo a manter o intercâmbio
				de potência ativa programado entre áreas. Os erros de intercâmbio de
				potência ativa entre áreas são distribuídos entre os geradores das áreas,
				com base neste valor e de acordo com a participação de cada gerador.
					 */

					//dbar.setPg((StrToDouble(str.substring (33,37)))/100);

					
					/**G E R A Ç Ã O  R E A T I V A
				Valor de geração de potência reativa na barra, em Mvar. Para barra de carga
				este valor é fixo. Para barra de carga com limite de tensão, este valor é 
				mantido constante, enquanto a magnitude da tensão permanecer entre os limites
				especificados. Para barras de tensão regulada e de referência com limites de
				geração de potência reativa especificados, este campo pode ser deixado em branco.
				DEFAULT -> 0			
					 */

					//dbar.setQg((StrToDouble(str.substring (38,42)))/100);

					/**G E R A Ç Ã O  R E A T I V A  M Í N I M A
				Valor do Limite mínimo de geração de potência reativa na barra em Mvar
					 */

					//dbar.setQn((StrToDouble(str.substring (43,47)))/100);

					/**G E R A Ç Ã O  R E A T I V A  M Á X I M A
				Valor do Limite mínimo de geração de potência reativa na barra em Mvar
					 */
					//dbar.setQm((StrToDouble(str.substring (48,52)))/100);

					/**B A R R A  C O N T R O L A D A
				Para barras de tensão regulada e de referência, com limites de
				potência reativa especificados, este campo destina-se ao número 
				da barra cuja magnitude da tensão será controlada. O valor da 
				magnitude da tensão a ser mantido é obtido no campo TENSÃO do
				registro relativo à barra.
					 */

					//dbar.setBc(StrToInt(str.substring (53,58)));

					/**C A R G A  A T I V A
				Valor da carga ativa da barra, em MW. No caso da carga variar
				com a magnitude da tensão da barra, entre neste campo com o 
				valor da carga para tensão especificada no campo tensão para definição de carga
				DEFAULT -> 0
					 */

					//dbar.setPl((StrToDouble(str.substring (59,63)))/100);

					/**C A R G A  R E A T I V A
				Valor da carga reativa da barra, em Mvar. No caso da carga variar
				com a magnitude da tensão da barra, entre neste campo com o 
				valor da carga para tensão especificada no campo tensão para definição de carga
				DEFAULT -> 0
					 */

					//dbar.setQl((StrToDouble(str.substring (63,67)))/100);

					/**C A P A C I T O R    R E A T O R
				Valor da potência reativa injetada na barra, em Mvar por bancos de
				capacitores/reatores. O valor a ser preenchido neste campo refere-se 
				a potência reativa injetada na tensão nominal (1.0 pu). Este valor
				deve ser positivo para capacitores e negativos para reatores.
				DEFAULT -> 0
					 */
					
					insertData.setSh((StrToDouble(str.substring (68,72)))/200); 

					
					/** Á R E A 
				Número da área à qual a barra pertence
					 */

					//dbar.setAre(StrToInt(str.substring (73,75)));

					/**T E N S Ã O  C A R G A
				Tensão para definição de carga. Entre neste campo com o valor em pu
				da tensão para a qual foi medido o valor das parcelas ativa e reativa
				da carga definidos nos campos. Carga Ativa e Carga Reativa, respectivamente
				Ponto decimal implícito entre as colunas
					 */

					//dbar.setVf((StrToDouble(str.substring (76,79)))/1000);

					/*============================================================*/
					/* D A D O S  P A R A  E S T I M A Ç Ã O  D E  E S T A D O S  */
					/*============================================================*/

					/** F L A G  -  P O T Ê N C I A   A T I V A
					 */

					insertData.setTP(StrToInt(str.substring (103,104))); //grava flag no banco
					
					/* Armazena para utilizar em estimação fasorial (cálculo das correntes)
				Pode-se ter fluxo de corrente de 1->2, e não se ter Potência de 1->2.
				Desta forma, se o valor não fosse armazenado, não teriamos valores
				de fluxo de potência para calcular os valores da corrente, devido ao uso da flag.*/
					//armazena mesmo que a flag seja zero
				
					insertData.setP((StrToDouble(str.substring (104,110)))/100);//banco
				  //  insertData.setTipo_Medida().add("P:"+ str.substring (0,5).trim());
					insertData.setTipo_Medida("P:"+ str.substring (0,5).trim());
					
				/*	int TP = 0;//zera a flag
					TP = StrToInt(str.substring (103,104)); //lê a flag
					// Armazena para calcular a corrente caso tenha corrente
					dbase.setP((StrToDouble(str.substring (104,110)))/100);

					if (TP==1) // se a flag for verdadeira, então
					{ 
						// Armazena para utilizar em estimação convencional 
						dbar.setP((StrToDouble(str.substring (104,110)))/100);
						// armazena nome da medida
						dbase.setTipo("P:" + str.substring (0,5).trim()); 
					}
*/
					
					/** F L A G  -  P O T Ê N C I A   R E A T I V A
					 */


				//	int TQ = 0;//zera a flag
					insertData.setTQ(StrToInt(str.substring (112,113)));
					//armazena em DBASE
				//	dbar.setQ(StrToDouble((str.substring (113,120)))/100);
					insertData.setQ(StrToDouble((str.substring (113,120)))/100);
					insertData.setTipo_Medida("Q:"+ str.substring (0,5).trim());
					
/*
					//armazena em DBAR
					if (TQ==1) 
					{
						dbar.setQ((StrToDouble(str.substring (113,120)))/100);
						dbase.setTipo("Q:" + str.substring (0,5));
					}
					*/

					/** F L A G  -  M A G N I T U D E   D E   T E N S Ã O 
					 */
					//armazena em DBASE
					//dbase.setV((StrToDouble(str.substring (122,128)))/1000);
					insertData.setTV(StrToInt(str.substring (121,122)));
					insertData.setV((StrToDouble(str.substring (122,128)))/1000);
					V.add((StrToDouble(str.substring (122,128)))/1000);
					insertData.setTipo_Medida("V:"+ str.substring (0,5).trim());
					
					//int TV = 0;//zera a flag
					
/*
					if (TV==1) // se a flag for verdadeira, então
					{
						dbar.setV((StrToDouble(str.substring (122,129)))/1000);
						dbase.setTipo("V:" + str.substring (0,5).trim());

					}
*/
					/**F L A G  -  M A G N I T U D E   D E   T E N S Ã O  P M U 
					 */
					
					//dbar.getV_pmu().add(dbar.getVfc().get(i)); //V_pmu = V
					insertData.setV_pmu((StrToDouble(str.substring (24,28)))/100); //V_pmu = V
					insertData.setTipo_Medida("V_pmu:"+ str.substring (0,5).trim());
				
					/** F L A G  -  A N G U L O  P M U 
					 * 
					 */

					
					/*F L A G  -  M A G N I T U D E   D E   T E N S Ã O  P M U 

				int TF = 0;//zera a flag
				TF = StrToInt(str.substring (133,134));

				if (TF==1) // se a flag for verdadeira, então
				{
				dbar.setV_pmu((StrToDouble(str.substring (134,143)))/100);
				dbase.Tipo("V_pmu:" + str.substring (0,4));
				}
				



				 F L A G  -  A N G U L O  P M U 

				int TA = 0;//zera a flag
				TA = StrToInt(str.substring (144,144));


				if (TA==1) // se a flag for verdadeira, então
				{
				dbar.setAng_pmu(StrToDouble(str.substring (145,150)));
				dbase.Tipo("Ang_pmu:" + str.substring (0,4));
				}
					 */

					str = reader.readLine();  // armazena primeira linha em str;
					str2 = str.substring (0,5);
					++i;
					session.save(insertData);
					session.flush(); 
					tx.commit();
				}while(!str2.equals("99999")); //eqto não for o fim dos dados de barra
				
				
				
				getAngPmu(NBAR, insertData);//calcula os angulos de tensão.
				for ( int i1=0; i1 < Num.size(); i1++ ) {
					//SessionFactory factorys = new Configuration().addAnnotatedClass(DbarDAO.class).configure("escrevebanco.cfg.xml").buildSessionFactory(); // deve ser instanciado somente uma vez
					session = factory.openSession();
					
					// inicia uma transação
					tx = session.beginTransaction();
					//insertData.setDbarId(1);
					insertData.setAng_pmu(Ang_pmu.get(i1));
				//	insertData.setTipo_Medida("Ang_pmu:"+ Num.get(i1));
					session.saveOrUpdate(insertData);
					session.flush(); 
					tx.commit();
				}
				
				//tx.commit();
			}//fecha if


			/*============================================================*/
			/*           L E I T U R A   D A D O S  D E  L I N H A        */
			/*============================================================*/


			if (str2.compareTo("(De") == 0)
			{
			//	Session session = null ;
			//	Transaction tx = null;
				DlinDAO insertData1 = new DlinDAO();
				SessionFactory factory = new Configuration().addAnnotatedClass(DlinDAO.class).configure("escrevebanco.cfg.xml").buildSessionFactory(); // deve ser instanciado somente uma vez
				session = factory.openSession();
				// inicia uma transação
				tx = session.beginTransaction();
				/*============================================================*/
				/*  Este laço extrai:                                         */
				/* 1- dados base de linha                                     */
				/* 2- dados para estimação de estado                          */
				/* 3- dados das medidas fasoriais sincronizadas               */
				/*============================================================*/
				str = reader.readLine();  // armazena primeira linha em str;
				int i=0;
				

				do{

					
					
				//	dlin.setA(StrToInt(str.substring (0,5)));
				//	dlin.setDlinId(i);
			//		insertData.setDlinId(dlin.setDlinId(i));

					//inserindo no BANCO dados para estimação de estado.

					
					
					/**DA BARRA
				Número da barra de uma das extremidades do circuito
				como definido no campo Número
					 */
					// copia o conteudo de (De )

					//dlin.setDe(StrToInt(str.substring (0,5)));
					insertData1.setDe(StrToInt(str.substring (0,5)));
					De.add(StrToInt(str.substring (0,5)));
					NLIN++;
					


					/**O P E R A Ç Ã O
				A ou 0 = adição de dados de barra
				E ou 1 = eliminação de dados de barra
				M ou 2 = modificação de dados de barra
				DEFAULT -> A
					 */

			//		dlin.setOperacao(StrToInt(str.substring (7,8)));

					/**PARA BARRA
			    Número da barra da outra extremidade do circuito
				como definido no campo Número
					 */

				//dlin.setPara(StrToInt(str.substring (10,15)));
					insertData1.setPara(StrToInt(str.substring (10,15)));
					Para.add(StrToInt(str.substring (10,15)));
					



					/**CIRCUITO
			    Número de identificação do circuito CA em paralelo
					 */

		//			dlin.setNc(StrToInt(str.substring (15,17)));

					/**E S T A D O 
				L - se a barra estiver em operação
				D - se a barra circuito estiver fora de operação (desligado)
				DEFAULT -> L
					 */

		//			dlin.setE(StrToInt(str.substring (17,18)));

					/**Proprietário
				F- se o circuito pertencer a área da barra definida no campo DA BARRA
				T- se o circuito pertencer a área da barra definida no campo PARA BARRA	
					 */

		//			dlin.setProp(str.substring (18,19));

					/**Resistência
				 Valor da resistência do circuito em %. Para transformadores este valor
				 corresponde ao valor da resistência para o tap nominal. 
					 */

					//dlin.setR((StrToDouble(str.substring (20,26)))/100);
					insertData1.setR((StrToDouble(str.substring (20,26)))/100);
					


					/**Reatância
				 Valor da reatância do circuito em %. Para transformadores este valor
				 corresponde ao valor da reatância para o tap nominal. 
					 */

					//dlin.setX((StrToDouble(str.substring (26,32)))/100);
					insertData1.setX((StrToDouble(str.substring (26,32)))/100);
					


					/**Susceptância
				 Valor total da susceptância shunt do circuito, em Mvar
					 */

					insertData1.setB((StrToDouble(str.substring (32,38)))/200);

					/**Tap
				Valor do Tap referido à barra definida no campo DA BARRA,
				em p.u., para os transformadores de tap fixo ou, uma 
				estimativa deste valor para	os transformadores com 
				variação automática de tap (LTC).
					 */
					//Obs: Tap não pode ser zero

					if(str.substring(38,43).trim().isEmpty()) 
					{
						insertData1.setTap(1.0);
					}else
					{
						insertData1.setTap(StrToDouble(str.substring(38,43)));
					}

					/**Tap mínimo
				Valor mínimo que o tap pode assumir, em p.u., para transformadores
				com variação automática de tap. 
					 */

	//				dlin.setTmn(StrToInt(str.substring(43,48)));

					/**Tap Máximo
				Valor máximo que o tap pode assumir, em p.u., para transformadores
				com variação automática de tap.
					 */

	//				dlin.setTmx(StrToInt(str.substring(48,53)));

					/**Defasagem
				Valor do ângulo de defasamento, em graus, para transformadores defasadores.
				O defasamento angular especificado é aplicado em relação
				ao ângulo da barra definido no campo Da Barra.
					 */

					insertData1.setPhs(Math.toRadians(StrToInt(str.substring(53,58))));


					/**Barra Controlada
				No caso de circuitos tipo transformador com variação automática de tap
				este campo é destinado ao número da barra cuja magnitude da tensão deve ser controlada
					 */

//					dlin.setBc(StrToInt(str.substring(58,64)));

					/**Capacidade Normal
				Capacidade de carregamento do circuito em condições normais para fins de monitoração
				de fluxo, em MVA.
					 */

//					dlin.setCn(StrToInt(str.substring(64,68)));

					/**Capacidade Emergência
				Capacidade de carregamento do circuito em condições de emergência
				para fins de monitoração de fluxo, em MVA.
					 */

//					dlin.setCe(StrToInt(str.substring(68,72)));

					/**Número de Steps
				Número de posições intermediárias entre o tap mínimo e o tap máximo
				para transformadores de tap variável
					 */

//					dlin.setNs(StrToInt(str.substring(72,74)));


					/*============================================================*/
					/* D A D O S  P A R A  E S T I M A Ç Ã O  D E  E S T A D O S  */
					/*============================================================*/

					/** F L A G  - F L U X O  D E   P O T Ê N C I A   A T I V A  K -> M
					 */

					insertData1.setTPkm(StrToInt(str.substring (106,107))); //lê a flag
					insertData1.setPkm((StrToDouble(str.substring (107,114)))/100);
					Pkm.add((StrToDouble(str.substring (107,114)))/100);//armazena na variável local para cálculo da corrente
					//insertData1.setTipo("P:" + str.substring (0,5).trim() + "-" + str.substring (10,15).trim()); 

					/** F L A G  - F L U X O  D E   P O T Ê N C I A   R E A T I V A  K -> M
					 */

					insertData1.setTQkm(StrToInt(str.substring (115,116))); //lê a flag
					insertData1.setQkm((StrToDouble(str.substring (116,123)))/100);
					Qkm.add((StrToDouble(str.substring (116,123)))/100);
					//insertData1.setTipo("Q:" + str.substring (0,5).trim() + "-" + str.substring (10,15).trim()); 
					

					/** F L A G  - F L U X O  D E   P O T Ê N C I A  A T I V A  M -> K
					 */

					insertData1.setTPmk(StrToInt(str.substring (130,131))); //lê a flag
					insertData1.setPmk((StrToDouble(str.substring (131,139)))/100);
					Pmk.add((StrToDouble(str.substring (131,139)))/100);
					//insertData1.setTipo("P:" + str.substring (10,15).trim() + "-" + str.substring (0,5).trim());
			
					

					/** F L A G  - F L U X O  D E   P O T Ê N C I A  R E A T I V A  M -> K
					 */


					insertData1.setTQmk(StrToInt(str.substring (138,140))); //lê a flag
					insertData1.setQmk((StrToDouble(str.substring (140,147)))/100);
					Qmk.add((StrToDouble(str.substring (140,147)))/100);
					//insertData1.setTipo("Q:" + str.substring (10,15).trim() + "-" + str.substring (0,5).trim()); 


					/**
					 * O valor das correntes serão calculados e não medidos.
					 *
					 * F L U X O  D E  C O R R E N TE  K -> M
					 * são calculados fluxos de corrente em todas as barras. Entretanto em Form_OpcoesEstimador o usuário irá selecionar 
					 * quais ele quer considerar
					 */


					insertData1.setI_pmu_km(Math.sqrt(Math.pow(Pkm.get(i),2)+ Math.pow(Qkm.get(i),2))/ V.get(i)); 
					dbar.getTipo_Medida().add("I_pmu:"+ De.get(i) + "-"+ Para.get(i));
					//insertData.setTipo("I_pmu:"+ dlin.getDe().get(i) + "-"+ dlin.getPara().get(i));
					/**
					 * O valor das correntes serão calculados e não medidos.
					 *
					 * F L U X O  D E  C O R R E N TE  M -> K
					 * são calculados fluxos de corrente em todas as barras. Entretanto em Form_OpcoesEstimador o usuário irá selecionar 
					 * quais ele quer considerar
					 */
					// Ikm = (Pkm^2 + Qkm^2)^(1/2) / Vk
					insertData1.setI_pmu_mk(Math.sqrt(Math.pow(Pmk.get(i), 2)+ Math.pow(Qmk.get(i), 2))/V.get(i)); //deve calcular
					dbar.getTipo_Medida().add("I_pmu:"+ Para.get(i) + "-"+ De.get(i));
				//	insertData.setTipo("I_pmu:" + dlin.getPara().get(i) + "-" + dlin.getDe().get(i)); 
			
			
					/**
					 * O valor das correntes serão calculados e não medidos.
					 *
					 * Â N G U L O  D E  C O R R E N TE  K -> M
					 * são calculados ângulos de corrente em todas as barras. Entretanto em Form_OpcoesEstimador o usuário irá selecionar 
					 * quais ele quer considerar
					 */
	
					str = reader.readLine();  // armazena primeira linha em str;
					str2 = str.substring (0,5);
					++i;//incrementa contador usado para cálculo do que não é medido
					session.save(insertData1);
					session.flush();
					tx.commit();
				}while(!str2.equals("99999")); //eqto não for o fim dos dados de linha
				
				//getIkm(NLIN);//fluxo de corrente de k -> m
				getTetaIkm(NBAR, NLIN, insertData1);//ângulo da corrente k -> m
				//getImk(NLIN);
				getTetaImk(NBAR, NLIN, insertData1);
				
				for ( int i1=0; i1 < NLIN; i1++ ) 
				{
				insertData1.setI_ang_pmu_km(I_ang_pmu_km.get(i1));
				insertData1.setI_ang_pmu_mk(I_ang_pmu_mk.get(i1));
				tx.commit();
				}
				
			}//fecha if


			//strLine = str2.substring (0,3);

		}  while(!str2.equals("FIM"));//ler o arquivo por completo



	

	}//	public void ExtrairDados(File selFile) 
	
	
	//Calcula os Angulos de Tensão (Dados de barra)
	
	public void getAngPmu(int NBAR, DbarDAO insertData)
	{
		for (int i = 0; i < NBAR; ++i)
		{
			Double t_ref_med = 0.0;

			for (int k = 0; k < NBAR; ++k)
			{
				t_ref_med += (Angfc.get(k))/(NBAR-1); 
			}
			Ang_pmu.add(Angfc.get(i) + t_ref_med);//adiciona os ângulos em Ang_Pmu
		
		//	dbar.getTipo_Medida().add("Ang_pmu:"+ Num.get(i));
		}
		
	}
	
	/** FLUXO DE CORRENTE
	 * CORRENTE K -> M 
	 * */
	/*
	public void getIkm(int NLIN){

		for (int i = 0; i < NLIN; ++i) {
			// Ikm = (Pkm^2 + Qkm^2)^(1/2) / Vk
			I_pmu_km.add(i,Math.sqrt(Math.pow(Pkm.get(i),2)+ Math.pow(Qkm.get(i),2))/ V.get(i)); 
			dbase.getTipo().add("I_pmu:"+ De.get(i) + "-"+ Para.get(i));
		}
	}
	*/
	public void getTetaIkm(int NBAR, int NLIN, DlinDAO insertData1)
	{
		for (int j = 0; j < NBAR; ++j) {
			//percorre Pkm e Qkm
			for (int i = 0; i < NLIN; ++i){																
				int k = De.get(i) - 1;// linha
				if (j == k){
					I_ang_pmu_km.add(i,Angfc.get(j)- Math.toRadians(Math.atan(Qkm.get(i)/ Pkm.get(i))));
					insertData1.setTipo_Medida("I_ang_pmu:"+ De.get(i) + "-"+ Para.get(i));
				}
			}
		}
	}
/*	
	public void getImk(int NLIN){

		for (int i = 0; i < NLIN; ++i)
		{ 
			// Ikm = (Pkm^2 + Qkm^2)^(1/2) / Vk
			I_pmu_mk.add(Math.sqrt(Math.pow(Pmk.get(i), 2)+ Math.pow(Qmk.get(i), 2))/V.get(i)); //deve calcular
			dbase.getTipo().add("I_pmu:" + Para.get(i) + "-" + De.get(i)); 

		}
	}
*/
	public void getTetaImk(int NBAR, int NLIN, DlinDAO insertData1)
	{
		
		for (int j = 0; j < NBAR; ++j) 
		{
			//percorre Pkm e Qkm
			for (int i = 0; i < NLIN; ++i)
			{																
				int k = Para.get(i) - 1;// linha
				if (j == k)
				{
					I_ang_pmu_mk.add(i,Angfc.get(j)- Math.toRadians(Math.atan(Qmk.get(i)/ Pmk.get(i))));
					insertData1.setTipo_Medida("I_ang_pmu:"+ Para.get(i) + "-"+ De.get(i));
					
				}
			}
		}
	}
	

	
	


}//public class ExtrairDados
nadasei

Assim fica o banco qdo dou save.update.
ele coloca somente o terceiro valor, mas não os outros…



nadasei

trocando para IDENTITY e usando saveOrUpdate, fica assim:

Criado 9 de julho de 2012
Ultima resposta 10 de jul. de 2012
Respostas 4
Participantes 2