Подтвердить что ты не робот

Другой повторяющийся столбец при сопоставлении ошибки сущности

Несмотря на все остальные сообщения, я не могу найти решение этой ошибки с Glassfish, на MacOSX, Netbeans 7.2.

Here the error :
SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer
prepare method
SEVERE: Exception while preparing the app
SEVERE: [PersistenceUnit: supmarket] Unable to build EntityManagerFactory

...

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity:
com.supmarket.entity.Sale column: customerId
(should be mapped with insert="false" update="false")

Здесь код:

Sale.java

@Entity
public class Sale {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable=false)
    private Long idFromAgency;

    private float amountSold;

    private String agency;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date createdate;

    @Column(nullable=false)
    private Long productId;

    @Column(nullable=false)
    private Long customerId;

    @ManyToOne(optional=false)
    @JoinColumn(name="productId",referencedColumnName="id_product")
    private Product product;

    @ManyToOne(optional=false)
    @JoinColumn(name="customerId",referencedColumnName="id_customer")
    private Customer customer;


    public void Sale(){}    
    public void Sale(Long idFromAgency, float amountSold, String agency
            , Date createDate, Long productId, Long customerId){        
        ...
    }

    // then getters/setters
}

Customer.java

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id_customer")
    private Long id_customer;

    @Column(nullable=false)
    private Long idFromAgency;

    private String  gender,
                    maritalState,
                    firstname,
                    lastname,
                    incomeLevel;

    @OneToMany(mappedBy="customer",targetEntity=Sale.class, fetch=FetchType.EAGER)
    private Collection sales;


    public void Customer(){}

    public void Customer(Long idFromAgency, String gender, String maritalState,
            String firstname, String lastname, String incomeLevel) {
        ...
    }

}

Product.java

public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id_product")
    private Long id_product;

    @Column(nullable=false)
    private Long idFromAgency;

    private String name;

    @OneToMany(mappedBy="product",targetEntity=Sale.class, fetch=FetchType.EAGER)
    private Collection sales;

    //constructors + getters +setters
}

Заранее благодарим за ваше время!

4b9b3361

Ответ 1

Сообщение ясное: у вас есть повторный столбец в сопоставлении. Это означает, что вы дважды сопоставили один столбец базы данных. И действительно, у вас есть:

@Column(nullable=false)
private Long customerId;

а также:

@ManyToOne(optional=false)
@JoinColumn(name="customerId",referencedColumnName="id_customer")
private Customer customer;

(и то же самое для productId/product).

Вы не должны ссылаться на другие объекты по их идентификатору, а на прямую ссылку на объект. Удалите поле customerId, это бесполезно. И сделайте то же самое для productId. Если вам нужен идентификатор клиента для продажи, вам просто нужно сделать это:

sale.getCustomer().getId()

Ответ 2

Если вы застряли в устаревшей базе данных, где кто-то уже размещал аннотации JPA, но НЕ определял отношения, и теперь вы пытаетесь определить их для использования в своем коде, тогда вы не сможете удалить clientId @Column поскольку другой код может напрямую ссылаться на него. В этом случае определите отношения следующим образом:

@ManyToOne(optional=false)
@JoinColumn(name="productId",referencedColumnName="id_product", insertable=false, updatable=false)
private Product product;

@ManyToOne(optional=false)
@JoinColumn(name="customerId",referencedColumnName="id_customer", insertable=false, updatable=false)
private Customer customer;

Это позволяет вам получить доступ к отношениям. Однако, чтобы добавить/обновить отношения, вы будете манипулировать внешними ключами напрямую через их определенные значения @Column. Это не идеальная ситуация, но если вам предоставлена ​​такая ситуация, по крайней мере вы можете определить отношения, чтобы успешно использовать JPQL.

Ответ 3

@Id
@Column(name = "COLUMN_NAME", nullable = false)
public Long getId() {
    return id;
}

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = SomeCustomEntity.class)
@JoinColumn(name = "COLUMN_NAME", referencedColumnName = "COLUMN_NAME", nullable = false, updatable = false, insertable = false)
@org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL)
public List<SomeCustomEntity> getAbschreibareAustattungen() {
    return abschreibareAustattungen;
}

Если вы уже сопоставили столбец и случайно установили одинаковые значения для name и referatedColumnName в @JoinColumn, спящий режим дает ту же глупость ошибка

Ошибка:

Вызвано: org.hibernate.MappingException: повторный столбец в сопоставлении для объекта: com.testtest.SomeCustomEntity column: COLUMN_NAME (должно быть сопоставлено с insert = "false" update = "false" )

Ответ 4

используйте это, это работа для меня:

@Column(name = "candidate_id", nullable=false)
private Long candidate_id;
@ManyToOne(optional=false)
@JoinColumn(name = "candidate_id", insertable=false, updatable=false)
private Candidate candidate;

Ответ 5

Позаботьтесь о предоставлении только одного сеттера и геттера для любого атрибута. Лучший способ приблизиться - записать определение всех атрибутов, а затем использовать eclipse generate setter и getter, а не делать это вручную. Опция поставляется с правой кнопкой мыши → source → Generate Getter и Setter.