Working with Objects Fields Defined is Multiple Tables.

classic Classic list List threaded Threaded
2 messages Options
PunxsutawneyPhil3 PunxsutawneyPhil3
Reply | Threaded
Open this post in threaded view
|

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/
ilya.kasnacheev ilya.kasnacheev
Reply | Threaded
Open this post in threaded view
|

Re: Working with Objects Fields Defined is Multiple Tables.

Hello!

There's an answer on stack overflow:

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

Regards,
--
Ilya Kasnacheev


сб, 20 мар. 2021 г. в 02:05, PunxsutawneyPhil3 <[hidden email]>:
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/