在映射另一个重复列实体错误(Another Repeated column in mapping f

2019-07-20 12:41发布

尽管所有的人的帖子,我找不到这个错误在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
}

Answer 1:

信息是明确的:你必须在映射重复列。 这意味着你映射到同一数据库列的两倍。 事实上,你必须:

@Column(nullable=false)
private Long customerId;

并且:

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

(以及同样适用productId / product )。

你不应该用自己的ID引用其他实体,而是直接引用的实体。 删除customerId字段,也没用。 而做同样productId 。 如果你想出售的客户ID,你只需要做到这一点:

sale.getCustomer().getId()


Answer 2:

如果你被卡住,其中有人已经放置在JPA注释,但没有明确的关系,现在你正试图确定他们在代码中使用旧的数据库,那么你可能无法删除的客户ID @列,因为其他的代码可直接引用它了。 在这种情况下,定义如下关系:

@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。



Answer 3:

使用这个,是我的工作:

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


Answer 4:

@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;
}

如果您已经映射了一个列,并不期而遇设置名称referencedColumnName@JoinColumn休眠相同的值给出了同样的愚蠢错误

错误:

org.hibernate.MappingException:通过引起映射重复列实体:com.testtest.SomeCustomEntity柱:COLUMN_NAME(应当与插入物被映射=“假”更新=“假”)



Answer 5:

小心只提供1 setter和getter任何属性。 接近最好的办法是写下所有属性的定义,然后用eclipse生成setter和getter工具,而不是做手工。 选项亮起右点击 - >来源 - >生成getter和setter。



文章来源: Another Repeated column in mapping for entity error