Hibernate @ManyToOne и @OneToMany с Liquibase - PullRequest
0 голосов
/ 29 августа 2018

Я был на этом в течение нескольких ночей. Я хотел бы связать число в пользователе (один пользователь на много номеров) с пользователем в количестве (много номеров на одного пользователя). Мне не повезло, и мне нужны твои знания. Независимо от того, что я делаю, я всегда получаю ошибки с тем или этим Прямой ответ, что делать будет.

application.properties:

spring.jpa.hibernate.ddl-auto=validate

Сущность пользователя:

@Entity
@Table(name = "user")
public class Users implements Serializable {

  private static final long serialVersionUID = 2323232323L;

  @Id
  @Column(nullable = false)
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
  private List<Number> number;

Номер объекта:

@Entity
@Table(name = "number")
public class Number implements Serializable {

  private static final long serialVersionUID = 1212121212L;

  @Id
  @Column(nullable = false)
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne(cascade = CascadeType.ALL)
  private Users user;

LiquiBase:

<createTable tableName="user">
      <column name="id" type="BIGINT(8)" autoIncrement="true">
        <constraints nullable="false" primaryKey="true"/>
      </column>
      <column name="fk_number" type="BIGINT"/>
    </createTable>

    <createTable tableName="number">
      <column name="id" type="BIGINT(8)" autoIncrement="true">
        <constraints nullable="false" primaryKey="true"/>
      </column>
      <column name="user" type="BIGINT"/>
    </createTable>

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Насколько я понимаю, у вас будет внешний ключ в таблице число , который будет представлять пользователя, которому будет присвоен номер.

Поскольку вы не упоминаете @JoinColumn (аннотацию, которая содержит информацию о внешнем ключе) при указании отношения @ManyToOne в вашей числовой сущности, то по умолчанию jpa пытается найти столбец с именем user_id в вашей таблице номеров (которая недоступна)

Просто добавьте аннотацию @JoinColumn с соответствующими атрибутами, она должна работать.

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="<<name of foreign key in number table>>", refrencedColumnName = "id")

refrencedColumnName сообщает, на какой столбец должна ссылаться родительская сущность.

0 голосов
/ 29 августа 2018

Необходимо решить 2 проблемы:

  1. В модели реляционных таблиц вы обычно моделируете ассоциацию «многие к одному / один ко многим» со столбцом внешнего ключа на стороне многих. Итак, в вашем примере вам нужен только столбец внешнего ключа в таблице number, а не в таблице user.

  2. Если вы не укажете @JoinColumn, Hibernate ожидает, что имя столбца внешнего ключа следует этому шаблону <name of the attribute that owns association>_<name of the primary key of referenced entity>. В вашем примере Hibernate ожидает столбец number_id в таблице number. Вы можете узнать больше о сопоставлениях ассоциаций в моем Ultimate Guide - Сопоставлении ассоциаций с JPA и Hibernate .

Это должно работать, если вы сохраняете свои отображения сущностей и используете это определение таблицы:

<createTable tableName="user">
  <column name="id" type="BIGINT(8)" autoIncrement="true">
    <constraints nullable="false" primaryKey="true"/>
  </column>
</createTable>

<createTable tableName="number">
  <column name="id" type="BIGINT(8)" autoIncrement="true">
    <constraints nullable="false" primaryKey="true"/>
  </column>
  <column name="user_id" type="BIGINT"/>
</createTable>
...