2017-10-06 2 views
0

J'utilise Vaadin et EclipseLink. Il y a 2 tables, une est Mail, la deuxième en Client. PK pour Customer est customer_id, PK pour mail est mail_id. Table Mail a Customer_id en tant que clé étrangère. Comment puis-je le lier? J'ai essayé:Clé étrangère de liaison dans Vaadin (EclipseLink)

binder.forField(fkCustomerId) 
     .withConverter(new StringToBigDecimalConverter(FormMessages.NUMBERS_ONLY)) 
     .bind(Mail::getCustomerId, Mail::setCustomerId); 

Je vérifié la classe Courrier-entité et trouvé

@JoinColumn(name = "CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID") 
@ManyToOne 
private Customer customerId; 

J'ai vérifié cette page - https://vaadin.com/docs/v8/framework/datamodel/datamodel-forms.html mais il n'y avait rien fk de liaison.

+1

Il serait bon d'ajouter plus d'informations sur ce que vous voulez faire. Vous ne voulez probablement pas autoriser l'utilisateur à modifier directement votre clé primaire. Il devrait probablement être basé sur autre chose que l'entrée de l'utilisateur. – Mika

+0

Table Mail contient des paramètres de messagerie pour les clients pour une autre application et contient customer_id en tant que clé étrangère. EclipseLink l'a mappé en tant que client customerId mais je ne peux pas lier un objet de classe Customer, dois-je le convertir en quelque chose? – revolt

+1

Que voulez-vous faire avec l'objet client? Voulez-vous afficher la valeur customer_id dans une étiquette, afficher une liste déroulante pour créer une nouvelle connexion ou autre chose? – Mika

Répondre

1

Option 1: Convertir client ID

Ici, je suppose que champ ID de la classe client est appelé id et qu'il est de type Long. Cela vous permet d'accéder à ce champ ID via un convertisseur qui produit une présentation de chaîne non formatée. Notez que cela ne gère pas bien la valeur null.

binder.forField(fkCustomerId) 
     .withConverter(Long::valueOf, String::valueOf) 
     .bind("customerId.id"); 

Option 2: Convertir objet client

Cet exemple prendrait objet client et le convertir au format souhaité pour le champ ID client. Cela vous permet de gérer les valeurs null et de procéder à un formatage plus avancé en fonction de l'état de l'objet entier.

binder.forField(fkCustomerId) 
     .withConverter(new CustomerToCustomerIdConverter()) 
     .bind(Mail::getCustomerId, Mail::setCustomerId); 

Vous pouvez omettre convertToModel résultat dans le convertisseur parce que vous ne devriez pas être en train de créer des objets clients à partir des valeurs d'identité que les types d'utilisateurs.

public class CustomerToCustomerIdConverter implements Converter<String, Customer> { 
    @Override 
    public Result<Customer> convertToModel(String s, ValueContext valueContext) { 
     return Result.error("not supported"); 
    } 

    @Override 
    public String convertToPresentation(Customer customer, ValueContext valueContext) { 
     return Objects.toString(customer.getCustomerId(), ""); 
    } 
} 

style TextField

Pour le style TextField de configuration, vous devez configurer en mode lecture seule. Et si vous ne voulez pas obtenir la bordure du champ de texte, vous devez ajouter un style supplémentaire.

TextField fkCustomerId = new TextField(); 
fkCustomerId.addStyleName(ValoTheme.TEXTFIELD_BORDERLESS); 
fkCustomerId.setReadOnly(true);