Mimo wszystkich innych postów nie mogę znaleźć rozwiązania tego błędu w GlassFish, na 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")
Tutaj kod:
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
}
hibernate
jakarta-ee
mappingexception
canardman
źródło
źródło
customerId
? (np. z JSON).Customer customer = entityManager.getReference(customerId, Customer.class); sale.setCustomer(customer);
@EmbeddedId
klucz złożony międzycustomerId
a innym polemCustomer
klasy? W takim przypadku potrzebuję obu powtórzonych kolumn w mapowaniu, czy mam rację?@MapsId("customerId")
, patrz stackoverflow.com/questions/16775055/hibernate-embeddedid-joinJeśli utkniesz w starszej bazie danych, w której ktoś już umieścił adnotacje JPA, ale NIE zdefiniował relacji, a teraz próbujesz zdefiniować je do użycia w swoim kodzie, możesz NIE być w stanie usunąć customerId @Column od czasu innego kodu może już bezpośrednio odnosić się do niego. W takim przypadku zdefiniuj relacje w następujący sposób:
Umożliwia to dostęp do relacji. Jednak aby dodać / zaktualizować relacje, będziesz musiał manipulować kluczami obcymi bezpośrednio za pomocą ich zdefiniowanych wartości @Column. To nie jest idealna sytuacja, ale jeśli masz taką sytuację, przynajmniej możesz zdefiniować relacje, aby móc z powodzeniem używać JPQL.
źródło
ManyToOne
pola mapowania potrzebuję pola bezpośrednio zmapowanego na kolumnę złączenia.użyj tego, to działa dla mnie:
źródło
Jeśli już zmapowałeś kolumnę i przypadkowo ustawiłeś te same wartości dla nazwy, a referencedColumnName w hibernacji @JoinColumn daje ten sam głupi błąd
Błąd:
Przyczyna: org.hibernate.MappingException: powtórzona kolumna w mapowaniu dla encji: com.testtest.SomeCustomEntity kolumna: COLUMN_NAME (powinna być zamapowana z insert = "false" update = "false")
źródło
Mam nadzieję, że to pomoże!
źródło
Uważaj, aby zapewnić tylko 1 ustawiającego i pobierającego dla dowolnego atrybutu. Najlepszym sposobem podejścia jest zapisanie definicji wszystkich atrybutów, a następnie użycie narzędzia ustawiającego i pobierającego generowanie zaćmienia zamiast robienia tego ręcznie. Opcja jest dostępna po kliknięciu prawym przyciskiem myszy -> źródło -> Generuj pobierające i ustawiające.
źródło
Oznacza to, że dwukrotnie mapujesz kolumnę w swojej klasie encji. Wyjaśnienie na przykładzie ...
Rozwiązanie
Ponieważ mapowanie jest ważną częścią, nie chcesz tego usuwać. Zamiast tego usuniesz
Działa to w 100%. Przetestowałem to z bazą danych Postgres i Oracle.
źródło
Rozwiązaliśmy zależność cykliczną (jednostki nadrzędne-podrzędne), mapując jednostkę podrzędną zamiast jednostki nadrzędnej w Grails 4 (GORM).
Przykład:
źródło