엔티티 오류 매핑의 또 다른 반복 열


110

다른 모든 게시물에도 불구하고 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")

여기에 코드 :

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
}

답변:


129

메시지는 명확합니다. 매핑에 반복되는 열이 있습니다. 즉, 동일한 데이터베이스 열을 두 번 매핑했습니다. 그리고 실제로 :

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

1
같은 오류가 발생하지만 제 상황이 조금 다릅니다. 내 엔터티는 동일한 유형의 하나 이상의 엔터티의 아버지 일 수 있습니다. 아이들은 자신의 고유 한 ID뿐만 아니라 아버지의 ID에 대한 참조를 가지고 있습니다. 이러한 순환 종속성을 어떻게 해결할 수 있습니까?
Ciri

@JBNizet 그렇다면 어떻게 특정 판매를 저장할customerId있습니까? (예 : JSON에서).
Mikhail Batcer 2015

2
Customer customer = entityManager.getReference(customerId, Customer.class); sale.setCustomer(customer);
JB Nizet 2015

5
클래스의 다른 필드와 @EmbeddedId사이에 복합 키 가있는 경우를 어떻게 처리 합니까? 이 경우 매핑에 반복되는 열이 모두 필요합니다. 맞습니까? customerIdCustomer
아모 로스 루이

2
@louisamoros 예, 반복하지만 추가합니다 @MapsId("customerId"). stackoverflow.com/questions/16775055/hibernate-embeddedid-join
Dalibor Filus

71

누군가가 이미 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을 성공적으로 사용할 수 있습니다.


1
감사합니다. 이것은 ManyToOne매핑 필드 외에도 조인 열에 직접 매핑 된 필드가 필요합니다.
ryenus

이는 동시에 앞쪽 키와 기본 키인 필드가있을 때 올바른 솔루션입니다.
AntuanSoft

오 마이 갓, 당신은 내 하루를
구했을

22

이것을 사용하면 나를 위해 일합니다.

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

덕분에이 솔루션 I 필요 정확히

optional = true로도 작동합니다.
Ondřej Stašek

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"로 매핑되어야 함)


2
여기서 중요한 점은 "insert = false update = false로 매핑해야합니다"라는 오류가 있지만 실제 매개 변수 / 메소드는 "insertable = false, updatable = false"여야한다는 것입니다.
Night Owl

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

0

모든 속성에 대해 하나의 setter 및 getter 만 제공하도록주의하십시오. 접근하는 가장 좋은 방법은 모든 속성의 정의를 기록한 다음 수동으로 수행하는 대신 eclipse generate setter 및 getter 유틸리티를 사용하는 것입니다. 이 옵션은 오른쪽 클릭-> 소스-> Getter 및 Setter 생성에 있습니다.


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의 문자열 값을 할당하여 object1의 값을 전달할 수 있습니다.

이것은 100 % 작동합니다. Postgres 및 Oracle 데이터베이스로 이것을 테스트했습니다.


0

Grails 4 (GORM)에서 부모 엔티티 대신 자식 엔티티를 매핑하여 순환 종속성 (Parent-child Entities)을 해결했습니다.

예:

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]
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.