Как я могу установить другой идентификатор для имени столбца?

#java #playframework

#java #playframework

Вопрос:

Если быть точным, у меня есть эти коды на Java (класс A и класс B):

 //Class A
package models;
import java.util.*;
import javax.persistence.*;
import play.db.ebean.Model;

@Entity
@Table(name="A")
public class A extends Model {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="id_a_seq")
    @SequenceGenerator(name="id_a_seq", sequenceName="id_a_seq")
    @Column(name="ID_A", insertable=true, updatable=true, unique=true, nullable=false)
    public Integer id;

    @Column(name="NOME")
    public String nome;

    @Column(unique = true, name="CPF")
    public String cpf;

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name="A_B", 
                joinColumns={@JoinColumn(name="ID_A")}, 
                inverseJoinColumns={@JoinColumn(name="ID_B")})
    public List<B> lista = new ArrayList<B>();
}
  

 //Class B
package models;
import java.util.*;
import javax.persistence.*;
import play.db.ebean.Model;

@Entity
@Table(name="B")
public class B extends Model {

    public B() {}
    public B(Integer id, String nome) {
        this.id = id;
        this.nome = nome;
    }
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="id_b_seq")
    @SequenceGenerator(name="id_b_seq", sequenceName="id_b_seq")
    //@AttributeOverride(name = "id", column = @Column(name = "ID_B"))
    @Column(name="ID_B", insertable=true, updatable=true, unique=true, nullable=false)
    public Integer id;

    @Column(name="NOME")
    public String nome;

    @ManyToMany(mappedBy="lista")
    public List<A> lista = new ArrayList<A>();
}
  

Когда я запускаю localhost: 9000 в браузере, я получаю это сообщение об ошибке:

«Исключение PersistenceException: ошибка при объединении в [models.B.lista]. Не удалось найти локальное соответствие для [ID_B], Возможно, ошибка в @JoinColumn «.

Я мог бы решить эту проблему, переименовав ID_A и ID_B в ID (для обоих), но я не могу получить идентификатор имени для столбцов id (в таблице A и в таблице B). Мне нужно выяснить, как заставить Play принимать имена ID_A и ID_B для их имени столбца id.

Ответ №1:

Измените сопоставление в вашей lista связи на:

 @ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name = "A_B",
        joinColumns = {@JoinColumn(name = "ID_A", referencedColumnName = "ID_A")},
        inverseJoinColumns = {@JoinColumn(name = "ID_B", referencedColumnName = "ID_B")})
public List<B> lista = new ArrayList<B>();
  

Обратите внимание на добавление referencedColumnName в @JoinColumn .

referencedColumnName ссылка:

При использовании внутри аннотации JoinTable столбец ключа, на который ссылается ссылка, находится в таблице сущностей объекта-владельца или обратной сущности, если объединение является частью определения обратного соединения.

Комментарии:

1. Нет проблем. Если вы считаете, что я правильно ответил на ваш вопрос, не могли бы вы принять это? Спасибо