Спящий режим: отображение ссылки «один ко многим» из не первичного ключа в первичный ключ - PullRequest
0 голосов
/ 21 июня 2019

Я получил устаревшую базу данных, в которой (к сожалению) внешние ключи размещаются редко.Если я создаю свой собственный внешний ключ (столбец A.testnr указывает на B.nummer) в Java Hibernate использует первичный ключ A (столбец ID), что приводит (как и ожидалось) к ошибке.

Я прочитал, что мне нужно поместить mappedBy-Reference в столбец класса B. Первичный ключ в классе B - это число, я попытался изменить его на Set (A), но затем я получаю некоторыепостоянная ошибка.

Отображение ManyToOne-Relation - A.testnr -> B.nummer

Class A    

@Id
@Column(name = "NUMMER", unique = true, nullable = false, precision = 22, 
scale = 0)
public BigDecimal getNummer() {
 return this.nummer;
}

public void setNummer(BigDecimal nummer) {
  this.nummer = nummer;
 }

@ManyToOne
@JoinColumn(name = "nummer", referencedColumnName = "nummer")
public B getTestnr() {
  return this.testnr;
}

public void setTestnr(B testnr) {
  this.testnr = testnr;
}


Class B

@Id
@Column(name = "NUMMER", unique = true, nullable = false, precision = 22, 
  scale = 0) 
public BigDecimal getNummer() {
  return this.nummer;
}

public void setNummer(BigDecimal nummer) {
  this.nummer = nummer;
}

Сообщение об ошибке: javax.persistence.EntityNotFoundException по понятной причине не является первичным ключом в A (A.nummer)часть B.nummer.

Как я уже говорил, я попытался использовать MappedBy-Reference и изменил BigDecimal PK в классе B на Set (A).

@Id
@OneToMany(fetch = FetchType.EAGER, mappedBy = "testnr")
@Column(name = "NUMMER", unique = true, nullable = false, precision = 22, 
 scale = 0)
public Set<A> getNummern() {
  return this.nummern;
}

public void setNummern(Set<A> nummern) {
  this.nummern = nummern;
}

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

Моя цель - сопоставить не первичный ключ с первичным ключом другого класса, даже с помощью hibernate, или это ситуация, когда я вынужден использовать нативный sql?

1 Ответ

1 голос
/ 21 июня 2019

Если вы хотите объединить неиндексированный столбец, это абсолютно правильно, вы должны использовать referencedColumnName. Однако во втором отрывочном коде вы отметили свою коллекцию @ManyToOne как идентификатор, что неверно. Если я вас правильно понял, несколько A.nummer принадлежат одному B.testnr.

Вот как вы получаете то, что хотите:

Класс A , номер которого относится к testnr.

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

    @Id // a_table_id
    @Column(name = "NUMMER", unique = true, nullable = false, precision = 22)
    private BigDecimal nummer;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "nummer", referencedColumnName = "nummer")
    // make sure referenced column name matches column in table B
    private B testnr;

    public BigDecimal getNummer() {
        return this.nummer;
    }

    public void setNummer(BigDecimal nummer) {
        this.nummer = nummer;
    }

    public B getTestnr() {
        return this.testnr;
    }

    public void setTestnr(B testnr) {
        this.testnr = testnr;
    }

}

Класс B , testnr с несколькими номерами.

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

    @Id // b_table_id
    @Column(name = "b_table_id")
    private BigDecimal testnr;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "testnr")
    private Set<A> nummern;

    public Set<A> getNummern() {
        return this.nummern;
    }

    public void setNummern(Set<A> nummern) {
        this.nummern = nummern;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...