2014-11-17 4 views
0

Я немного новичок в JPA, и я стараюсь, чтобы мои классы сущностей работали правильно, но мой код всегда возвращает мне эту ошибку: «В поле есть много записываемых сопоставлений [PRODUTOS.MARCA_IDMARCA]»Проблемы во взаимоотношениях между таблицами в JPA

это мои классы сущностей:

@Entity 
public class Marca implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer idMarca; 
    private String nome; 
    private Integer idFornecedores; 
    . 
    . 
    . 
} 

Я пытаюсь сделать однонаправленный ManyToOne отношения между PRODUTOS и Marca (1 Marca для многих PRODUTOS):

@Entity 
public class produtos implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long idProdutos; 
    private int codBarras; 
    private String nome; 
    private float preco; 
    private int qtdProduto; 
    private int idCategoriaProduto; 
    @ManyToOne 
    private CategoriaProduto categoria; 
    private int Marca_idMarca; 
    @ManyToOne 
    private Marca marca; 
    . 
    . 
    . 
} 

Ошибка:

Exception Description: Multiple writable mappings exist for the field [PRODUTOS.MARCA_IDMARCA]. Only one may be defined as writable, all others must be specified read-only. 
Mapping: org.eclipse.persistence.mappings.ManyToOneMapping[marca] 
Descriptor: RelationalDescriptor(ClassesDeEntidade.produtos --> [DatabaseTable(PRODUTOS)]) 

Я действительно не знаю, что происходит. Может ли кто-нибудь объяснить мне, почему этот код неправильный?

EDIT:

Таблица определения:

PRODUTOS:

CREATE TABLE IF NOT EXISTS mydb. Produtos ( idProdutos INT NOT NULL AUTO_INCREMENT, codBarras INT (13) NOT NULL, nome VARCHAR (150) NOT NULL, preco ПОПЛАВКОВЫЕ NOT NULL, qtdProduto INT NOT NULL, idCategoriaProduto INT NOT NULL, Marca_idMarca INT NOT NULL , ПЕРВИЧНЫЙ КЛЮЧ (idProdutos), ИНДЕКС fk_Produtos_CategoriaProduto1_idx (idCategoriaProduto ASC), ИНДЕКС fk_Produtos_Marca1_idx (Marca_idMarca ASC), CONSTRAINT fk_Produtos_CategoriaProduto1 ИНОСТРАННОЙ КЛЮЧ (idCategoriaProduto) СПИСОК ЛИТЕРАЕЙ mydb. CategoriaProduto (idCategoriaProduto) ПО УДАЛИТЬ НЕТ ДЕЙСТВИЯ ON UPDATE NO ACTION, ОГРАНИЧЕНИЯ fk_Produtos_Marca1 FOREIGN KEY (Marca_idMarca) ЛИТЕРАТУРА mydb. Marca (idMarca) ON УДАЛИТЬ НЕТ ДЕЙСТВИЙ ПО ОБНОВЛЕНИЮ НЕТ ДЕЙСТВИЙ) ДВИГАТЕЛЬ = InnoDB;

Marca:

CREATE TABLE IF NOT EXISTS mydb. Marca ( idMarca INT NOT NULL AUTO_INCREMENT, nome VARCHAR (45) NOT NULL, idFornecedores INT NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (idMarca), ИНДЕКС fk_Marca_Fornecedores1_idx (idFornecedores ASC), CONSTRAINT fk_Marca_Fornecedores1 FOREIGN KEY (idFornecedores) ЛИТЕРАТУРА mydb. Fornecedores (idFornecedores) ON УДАЛИТЬ НЕТ ДЕЙСТВИЙ ПО ОБНОВЛЕНИЮ НЕТ ДЕЙСТВИЙ) ДВИГАТЕЛЬ = InnoDB;

ответ

0

Можете ли вы показать свои определения таблиц? Проблема заключается в том, что у вас есть два поля (возможно, Marca marca, которые содержат аннотацию @ManyToOne и int Marca_idMarca, которые имеют то же имя), сопоставляя их с тем же столбцом PRODUTO.ID_MARCA в базе данных.

Я знаю, что должен опубликовать это как комментарий, но я еще не могу прокомментировать.

+0

Я добавил определения таблиц. Но я все еще не понял, в чем проблема. – Pedro

+0

У вас есть 'int Marca_idMarca' и' Marca marca', ссылающиеся на объект 'Marca', верно? Вам это действительно нужно? Потому что вы всегда можете получить идентификатор «marca.getIdMarca()». – brlaranjeira

+0

Кажется, это была проблема. Когда я исправил это, он сработал. Благодаря! – Pedro