映射实体错误中的另一个重复列

尽管有其他所有的帖子,我还是无法在 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")

密码如下:

销售,咖啡

@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
}
305046 次浏览

信息很清楚: 映射中有一个重复的列。这意味着映射了同一个数据库列两次。事实上,你做到了:

@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()

如果你陷入了一个遗留数据库,其中有人已经放置了 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。

@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 hibernate 中也会出现同样愚蠢的错误

错误:

由: org.hibernate 引起。 MappingException: 映射实体中的重复列: com.testtest。 Some CustomEntity 列: COLUMN _ NAME (应该使用 insert = “ false”update = “ false”进行映射)

注意只为任何属性提供1个 setter 和 getter。最好的方法是写下所有属性的定义,然后使用 eclipsegeneratsetter 和 getter 实用程序,而不是手动完成。右键单击-> source-> Generate Getter and Setter,就会出现该选项。

使用这个,是为我工作:

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

希望这个能帮上忙!

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

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

    @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 数据库中测试过了。

我们已经通过映射子实体而不是 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]
}

我错误地在两个不需要的地方添加了 OneTomany 注释,删除了它,解决了问题。