You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ignite.apache.org by PunxsutawneyPhil3 <rw...@niksun.com> on 2021/03/19 23:05:12 UTC

Working with Objects Fields Defined is Multiple Tables.

I am working with Postgres as an external persistent store Ignite and want to
know the best way to define caches for objects who’s data is spread over
multiple tables.   

E.G. for to work with this Person and Car class and their tables below, I
have provided my own Implementation of the CacheStore.  This approach seems
to be very verbose however as I need to manually assign the field values
myself.  Are there any other methods I should be using to do this?  

public class PersonMO{
	private int id;
	private String name;
	private String address;
	private Set<Car> cars

	public PersonMO() {};
	public PersonMO(int id, String name, String address) {
		this.id = id;
		this.name = name;
		this.address = address;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name; 
	}

	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getAddress() {
		return address;
	}
	
	public void setAddress(String address) {
		this.address = address;
	}
	
	public String toString() {
		return "ID: "+id +", Name: "+name+" AD: " +address;
	}

	public void setCars(Set<Car> cars) {
		this.cars = cars;
	}
	
	public Set<Car> getCars() {
		return cars;
	}
}

public class Car {
	int id;
	private String name;
	
	public Car(int id, String name) {
		this.id = id;
		this.name = name;
	}
	
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}	
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name; 
	}
	
}


public class PersonMOCacheStore implements CacheStore<Integer, PersonMO>{

	@SpringResource(resourceName = "pgDataSource")
	private DriverManagerDataSource pgDataSource;
	
	@LoggerResource
    private IgniteLogger log;

	//public void loadCache(IgniteBiInClosure<Integer, PersonMO> clo, @Nullable
Object... args)
	@Override
	public void loadCache(IgniteBiInClosure<Integer, PersonMO> clo, Object...
args)
			throws CacheLoaderException {
		log.info(">> Loading cache from store...");
		
		try(Connection conn = pgDataSource.getConnection()){
			try(PreparedStatement st = conn.prepareStatement("select * from
PERSON")){
				try(ResultSet rs = st.executeQuery()){
					while(rs.next()) {
						PersonMO person = new PersonMO(rs.getInt(1),rs.getString(2),
rs.getString(3));
						person.setCars(getCarSet(conn, person.getId() ) ); 
						clo.apply(person.getId(), person);
					}
					log.info(">> Finished Loading cache from store...");
				}
			}
		}catch(SQLException e) {
			 throw new CacheLoaderException("Failed to load values from cache
store.",e);
		}
		
	}
	
	//implementation for IgniteCache.get
	@Override
	public PersonMO load(Integer key) throws CacheLoaderException {
		log.info(">> Loading person from store...");
		
		try (Connection conn = pgDataSource.getConnection()) {
			try(PreparedStatement st = conn.prepareStatement("select * from PERSON
where id = ?")){
				st.setString(1, key.toString());
				ResultSet rs = st.executeQuery();
				if(rs.next()) {
					PersonMO p= new PersonMO(rs.getInt(1),rs.getString(2),
rs.getString(3));
					//p.setCars( getCarSet(conn, p.getId() ) );
					return p;
				}else {
					return null;
				}
				
				
			}
		}catch(SQLException e) {
			 throw new CacheLoaderException("Failed to load values from cache
store.",e);
		}
	}


	private Set<Car> getCarSet(Connection conn, int personId) throws
SQLException{
		Set<Car> carSet = new HashSet<Car>();
		PreparedStatement st = conn.prepareStatement("select * from CAR where id =
"+ personId);
		ResultSet rs = st.executeQuery();
		
		while(rs.next()) {
			carSet.add(new Car(rs.getInt(1),rs.getString(2) ));
		}
		return carSet;
	}
	
}




--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/

Re: Working with Objects Fields Defined is Multiple Tables.

Posted by Ilya Kasnacheev <il...@gmail.com>.
Hello!

There's an answer on stack overflow:
https://stackoverflow.com/questions/66716680/how-to-define-ignite-caches-for-objects-joined-from-multiple-tables/66764133#66764133

If you have further questions, you can ask here as well.

Regards,
-- 
Ilya Kasnacheev


сб, 20 мар. 2021 г. в 02:05, PunxsutawneyPhil3 <rw...@niksun.com>:

> I am working with Postgres as an external persistent store Ignite and want
> to
> know the best way to define caches for objects who’s data is spread over
> multiple tables.
>
> E.G. for to work with this Person and Car class and their tables below, I
> have provided my own Implementation of the CacheStore.  This approach seems
> to be very verbose however as I need to manually assign the field values
> myself.  Are there any other methods I should be using to do this?
>
> public class PersonMO{
>         private int id;
>         private String name;
>         private String address;
>         private Set<Car> cars
>
>         public PersonMO() {};
>         public PersonMO(int id, String name, String address) {
>                 this.id = id;
>                 this.name = name;
>                 this.address = address;
>         }
>
>         public String getName() {
>                 return name;
>         }
>
>         public void setName(String name) {
>                 this.name = name;
>         }
>
>         public int getId() {
>                 return id;
>         }
>
>         public void setId(int id) {
>                 this.id = id;
>         }
>
>         public String getAddress() {
>                 return address;
>         }
>
>         public void setAddress(String address) {
>                 this.address = address;
>         }
>
>         public String toString() {
>                 return "ID: "+id +", Name: "+name+" AD: " +address;
>         }
>
>         public void setCars(Set<Car> cars) {
>                 this.cars = cars;
>         }
>
>         public Set<Car> getCars() {
>                 return cars;
>         }
> }
>
> public class Car {
>         int id;
>         private String name;
>
>         public Car(int id, String name) {
>                 this.id = id;
>                 this.name = name;
>         }
>
>         public int getId() {
>                 return id;
>         }
>
>         public void setId(int id) {
>                 this.id = id;
>         }
>
>         public String getName() {
>                 return name;
>         }
>
>         public void setName(String name) {
>                 this.name = name;
>         }
>
> }
>
>
> public class PersonMOCacheStore implements CacheStore<Integer, PersonMO>{
>
>         @SpringResource(resourceName = "pgDataSource")
>         private DriverManagerDataSource pgDataSource;
>
>         @LoggerResource
>     private IgniteLogger log;
>
>         //public void loadCache(IgniteBiInClosure<Integer, PersonMO> clo,
> @Nullable
> Object... args)
>         @Override
>         public void loadCache(IgniteBiInClosure<Integer, PersonMO> clo,
> Object...
> args)
>                         throws CacheLoaderException {
>                 log.info(">> Loading cache from store...");
>
>                 try(Connection conn = pgDataSource.getConnection()){
>                         try(PreparedStatement st =
> conn.prepareStatement("select * from
> PERSON")){
>                                 try(ResultSet rs = st.executeQuery()){
>                                         while(rs.next()) {
>                                                 PersonMO person = new
> PersonMO(rs.getInt(1),rs.getString(2),
> rs.getString(3));
>
> person.setCars(getCarSet(conn, person.getId() ) );
>                                                 clo.apply(person.getId(),
> person);
>                                         }
>                                         log.info(">> Finished Loading
> cache from store...");
>                                 }
>                         }
>                 }catch(SQLException e) {
>                          throw new CacheLoaderException("Failed to load
> values from cache
> store.",e);
>                 }
>
>         }
>
>         //implementation for IgniteCache.get
>         @Override
>         public PersonMO load(Integer key) throws CacheLoaderException {
>                 log.info(">> Loading person from store...");
>
>                 try (Connection conn = pgDataSource.getConnection()) {
>                         try(PreparedStatement st =
> conn.prepareStatement("select * from PERSON
> where id = ?")){
>                                 st.setString(1, key.toString());
>                                 ResultSet rs = st.executeQuery();
>                                 if(rs.next()) {
>                                         PersonMO p= new
> PersonMO(rs.getInt(1),rs.getString(2),
> rs.getString(3));
>                                         //p.setCars( getCarSet(conn,
> p.getId() ) );
>                                         return p;
>                                 }else {
>                                         return null;
>                                 }
>
>
>                         }
>                 }catch(SQLException e) {
>                          throw new CacheLoaderException("Failed to load
> values from cache
> store.",e);
>                 }
>         }
>
>
>         private Set<Car> getCarSet(Connection conn, int personId) throws
> SQLException{
>                 Set<Car> carSet = new HashSet<Car>();
>                 PreparedStatement st = conn.prepareStatement("select *
> from CAR where id =
> "+ personId);
>                 ResultSet rs = st.executeQuery();
>
>                 while(rs.next()) {
>                         carSet.add(new Car(rs.getInt(1),rs.getString(2) ));
>                 }
>                 return carSet;
>         }
>
> }
>
>
>
>
> --
> Sent from: http://apache-ignite-users.70518.x6.nabble.com/
>