tâche de démarrage du printemps pour mettre à jour la clé étrangère dans DB

Akki:

Je travaille sur l'API REST avec boot Spring qui va gérer la vente aux enchères des objets.

Les utilisateurs qui participent à la vente aux enchères seront séparés dans une table utilisateur

Les articles à enchères sera dans le tableau Auction_items , ainsi que le début de la vente aux enchères et de fin, null gagnant si la vente aux enchères est toujours en cours.

Toutes les offres faites par les utilisateurs pour les éléments respectifs sont là dans le tableau des offres

Je l' ai déjà essayé différentes façons (Cron, fixedRate, fixedDelay) pour planifier la tâche, a obtenu une erreur semblable pour tous, je soupçonnais qu'il pourrait y avoir un problème DB en raison de laquelle il se produit.

Voici les tables et la classe de modèle correspondant ainsi que le service et l'interface référentiel.

UTILISATEURS TABLE:

CREATE TABLE USERS
(
USER_ID SERIAL,
NAME VARCHAR(200),
EMAIL VARCHAR(200),
PASSWORD VARCHAR(200),
PRIMARY KEY(USER_ID)
);

AUCTION_ITEMS TABLE:

CREATE TABLE AUCTION_ITEMS
(
ITEM_ID SERIAL,
ITEM_NAME VARCHAR(200),
ITEM_DESCRIPTION TEXT,
START_TIME TIMESTAMP,
END_TIME TIMESTAMP,
STARTING_AMOUNT INT,
WINNER INT,
PRIMARY KEY(ITEM_ID),
FOREIGN KEY(WINNER) REFERENCES USERS(USER_ID) ON DELETE CASCADE
);

BIDS TABLE:

CREATE TABLE BIDS
(
BID_ID SERIAL,
ITEM_ID INT,
USER_ID INT,
AMOUNT INT,
PRIMARY KEY(BID_ID),
FOREIGN KEY(ITEM_ID) REFERENCES AUCTION_ITEMS(ITEM_ID) ON DELETE 
CASCADE,
FOREIGN KEY(USER_ID) REFERENCES USERS(USER_ID) ON DELETE CASCADE
);

Voici les classes de modèle pour les tableaux ci-dessus:

User.java:

@Entity
@Table(name="USERS")
public class User {

@Id
private Integer user_id;
private String name;
private String email;
private String password;

//getter setter methods
}

Item.java:

@Entity
@Table(name="AUCTION_ITEMS")
public class Item {

@Id
private Integer item_id;
private String item_name;
private String item_description;
private Timestamp start_time;
private Timestamp end_time;
private int starting_amount;
@ManyToOne
@JoinColumn(name="winner")
private User user;

//getter setter methods
}

Bid.java:

@Entity
@Table(name="BIDS")
public class Bid {

@Id
private Integer bid_id;
@ManyToOne
@JoinColumn(name="item_id")
private Item item;
@ManyToOne
@JoinColumn(name="user_id")
private User user;
private int amount;
//getter setter nethods
}

Ci - dessous la classe de service, où je suis en train de définir la méthode TâchePlanifiée () pour exécuter et calculer le vainqueur de l' article vendu aux enchères une fois l'heure de fin de l' article de vente aux enchères est passée:

ItemService.java:

@Service
public class ItemService {

    @Autowired
    private ItemRepository itemRepository;

    @Autowired
    private UserRepository userRepository;


    public List<Item> getAllItems(){
        return (List<Item>) itemRepository.findAll();
    }

    public Object getItem(Integer id) {
        Item i = itemRepository.findById(id).orElse(null);
        if(i.getUser()!=null) {
            return i.getUser();
        }
        else {
            //will be returning highest bid amount for that particular item
            return itemRepository.getMaxBid(id);
        }
    }

    @Scheduled(cron="20 36 17 * * ?")
    public void scheduledTask() {
        List<Item> listOfItems = (List<Item>)itemRepository.findAll();
        System.out.println("going to update DB");
        for(Item i : listOfItems) {
            Timestamp time = new Timestamp(System.currentTimeMillis());
            if(time.equals(i.getEnd_time()) || time.after(i.getEnd_time())) {
                if(i.getUser() == null) {
                    Integer item_id = i.getItem_id();
                    Integer winner_id = itemRepository.findWinner(item_id);
                    User u= userRepository.findById(winner_id).orElse(null);

                    i.setUser(u);
                    System.out.println("updated");
                }
            }
        }
    }

}

ItemRepository.java:

public interface ItemRepository extends CrudRepository<Item,Integer>{

@Query(value="select max(b.amount) from bids as b where b.item_id=?1", 
nativeQuery=true )
public Integer getMaxBid(Integer item_id);

@Query(value="select b.user_id from bids as b where b.item_id=?1 AND 
b.amount = (select max(amount) from bids);", nativeQuery=true)
public Integer findWinner(Integer id);

Voici l'erreur que je reçois une fois, vient le temps de mettre à jour les données du tableau:

22/04/2019 12: 55: 30,123 INFO 9100 --- [ordonnancement-1]> ohhiQueryTranslatorFactoryInitiator: HHH000397: Utilisation> ASTQueryTranslatorFactory va mettre à jour DB 22/04/2019 12: 55: 30,464 ERROR 9100 --- [Scheduling 1]> osssTaskUtils $ LoggingErrorHandler: erreur inattendue est survenue dans> tâche planifiée.

org.springframework.dao.InvalidDataAccessApiUsageException:> org.hibernate.QueryException: position JPA-param style n'était pas une intégrale> ordinale; exception imbriquée est java.lang.IllegalArgumentException:> org.hibernate.QueryException: position JPA style était pas param> intégrale ordinal> org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExcepti> onIfPossible (EntityManagerFactoryUtils.java:373) ~ [ressort orm-> 5.1.6.RELEASE.jar: 5.1.6.RELEASE] à> org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPo> ssibles (HibernateJpaDialect.java:255) ~ [ressort orm- >]> 5.1.6.RELEASE.jar: 5.1.6.RELEASE] à> org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExcepti> onIfPossible (AbstractEntityManagerFactoryBean.java:527) ~ [ressort orm-> 5.1.6. RELEASE.jar: 5.1.6.

Question: Créer une tâche planifiée qui fonctionne lorsque , au moment de la fin de la vente aux enchères d'un article et décide le gagnant de cet élément de la table des offres et stocke l'identifiant de l'utilisateur dans la colonne Vainqueur de la table Auction_items.

Je pense que la raison derrière l' erreur ci - dessus est, je l' ai créé une variable membre de l' utilisateur dans la classe de modèle, mais dans le côté de la table, il attend que l'ID utilisateur non sur l'ensemble de l' instance de l' utilisateur .

Même si c'est la raison, je ne suis pas sûr de savoir comment le résoudre, aussi , si ce n'est pas la raison, sera l'application stocke automatiquement la user_id appropriée dans la colonne de gagnant, si bon exemple d'utilisateur est définie à l' aide setUser ().

Notez que je l'ai utilisé @EnabledScheduling dans la classe, avec la méthode principale ().

MISE À JOUR: Collé nouvelle ItemService.java, Item.java En Item.java je l' ai utilisé pour la type de données utilisateur variable membre depuis qu'il a fait comme Integer ne fonctionnait pas

Akki:

Bon, alors dans la TâchePlanifiée () de ItemService.java, le contrôle a atteint tous les cas de partie et le point « i » a également été mis à jour se, je suppose que je devais sauver ce DB en utilisant itemRepository.save (i) Ci-dessous la la mise en œuvre complète de la méthode TâchePlanifiée ()

@Scheduled(cron="0 17 11 * * ?")
    public void scheduledTask() {
        List<Item> listOfItems = (List<Item>)itemRepository.findAll();
        System.out.println("going to update DB");
        for(Item i : listOfItems) {
            Timestamp time = new Timestamp(System.currentTimeMillis());
            if(time.equals(i.getEnd_time()) || time.after(i.getEnd_time())) {
                if(i.getUser() == null) {
                    Integer item_id = i.getItem_id();
                    Integer winner_id = itemRepository.findWinner(item_id);
                    User u= userRepository.findById(winner_id).orElse(null);

                    i.setUser(u);
                    itemRepository.save(i);//change in code, which seems to work now
                    System.out.println("printing item:");
                    System.out.println(i.getItem_description()+", "+i.getItem_name()+", "+i.getStarting_amount()+", "+i.getItem_id()+", "+i.getEnd_time()+", "+i.getStart_time()+", "+i.getUser().getUser_id());
                    System.out.println("updated");
                }
            }
        }
    }

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=237048&siteId=1
conseillé
Classement