2013-01-09 4 views
2

J'ai un problème avec l'erreur suivante:Mise en veille prolongée Bidirectionnelle plusieurs à un

Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/library.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: A Foreign key refering tv.mirada.connect.cashless.parking.model.PaymentInterface from tv.mirada.connect.cashless.parking.model.Merchant has the wrong number of column. should be 0 

J'ai passé environ une journée à la recherche de réponses et d'essayer chose, sans succès. Je n'ai pas vraiment besoin d'un accès bidirectionnel, je dois seulement être en mesure d'obtenir une ligne de table de marchand à partir d'une interface de paiement, mais il semble plus simple d'inclure le bidirectionnel plutôt que d'essayer d'obtenir un unidirectionnel.

Les tables que j'utilise sont la table marchande et la table d'interface de paiement. Je me rends compte que je pourrais faire référence directement à la table des marchands par la table des marchands, mais la table des commerçants a une extension d'information dans l'interface de paiement, il est donc plus logique de la cartographier de cette façon.

@Entity 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 
@Table(name = "park_merchant") 
public class Merchant implements java.io.Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name="id", unique=true, nullable=false) 
    private Integer id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="payment_interface_node_id", nullable = false) 
    private PaymentInterface paymentInterface; 


@Entity 
@Table(name = "park_payment_interface", uniqueConstraints = @UniqueConstraint(columnNames = "name")) 
public class PaymentInterface implements java.io.Serializable { 

    @Id 
    @OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL) 
    @JoinColumn(name = "node_id", unique = true, nullable = false) 
    private Node node; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "paymentInterface") 
    private Set<Merchant> merchants = new HashSet<Merchant>(0); 

Heureusement, il me manque quelque chose de simple.

Répondre

2

Ah, trouvé la solution. J'avais besoin de mettre @ManyToOne et @JoinColumn dans la table Merchant sur le getter, plutôt que sur la déclaration de variable. Je ne sais toujours pas pourquoi, mais au moins je sais comment maintenant.

Questions connexes