138

尽管有其他所有帖子,但我无法在 MacOSX、NetBeans 7.2 上使用 GlassFish 找到此错误的解决方案。

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")

这里的代码:

销售.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
}

客户.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) {
        ...
    }

}

产品.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
}
4

8 回答 8

168

信息很明确:映射中有重复的列。这意味着您将相同的数据库列映射了两次。事实上,你有:

@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()
于 2013-02-25T21:10:13.973 回答
82

如果您被遗留数据库困住,其中有人已经放置了 JPA 注释但没有定义关系,而您现在正尝试定义它们以在您的代码中使用,那么您可能无法删除 customerId @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。

于 2014-05-13T11:30:39.060 回答
31

使用这个,对我有用:

@Column(name = "candidate_id", nullable=false)
private Long candidate_id;
@ManyToOne(optional=false)
@JoinColumn(name = "candidate_id", insertable=false, updatable=false)
private Candidate candidate;
于 2017-06-14T08:13:56.090 回答
11
@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;
}

如果您已经映射了一个列并且不小心在@JoinColumn中为namereferencedColumnName设置了相同的值,那么休眠会给出同样的愚蠢错误

错误:

引起:org.hibernate.MappingException:实体映射中的重复列:com.testtest.SomeCustomEntity 列:COLUMN_NAME(应使用 insert="false" update="false" 映射)

于 2016-03-03T11:31:50.103 回答
1

希望这会有所帮助!

@OneToOne(optional = false)
    @JoinColumn(name = "department_id", insertable = false, updatable = false)
    @JsonManagedReference
    private Department department;

@JsonIgnore
    public Department getDepartment() {
        return department;
    }

@OneToOne(mappedBy = "department")
private Designation designation;

@JsonIgnore
    public Designation getDesignation() {
        return designation;
    }
于 2019-11-28T01:47:21.270 回答
0

我们通过在 Grails 4(GORM)中映射子实体而不是父实体来解决循环依赖(父子实体)。

例子:

Class Person {
    String name
}

Class Employee extends Person{
    String empId
}

//Before my code 
Class Address {
    static belongsTo = [person: Person]
}

//We changed our Address class to:
Class Address {
    static belongsTo = [person: Employee]
}
于 2020-06-19T08:13:02.820 回答
0

注意为任何属性只提供 1 个 setter 和 getter。最好的方法是写下所有属性的定义,然后使用 eclipse 生成 setter 和 getter 实用程序,而不是手动执行。该选项来自右键单击-> 源-> 生成 Getter 和 Setter。

于 2016-06-20T06:02:37.877 回答
0

这意味着您在实体类中映射列两次。举例说明...

    @Column(name = "column1")
    private String object1;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "column1", referencedColumnName = "column1")
    private TableClass object2;

上面代码片段中的问题是我们正在重复映射......

解决方案

由于映射是一个重要部分,您不想删除它。相反,您将删除

    @Column(name = "column1")
    private String uniqueId;

您仍然可以通过创建 TableClass 的对象并在其中分配 Object1 的 String 值来传递 object1 的值。

这 100% 有效。我已经用 Postgres 和 Oracle 数据库对此进行了测试。

于 2020-02-19T16:53:43.030 回答