Присоединиться к таблице с отдельным идентификатором - PullRequest
0 голосов
/ 25 июня 2018

В моем весеннем загрузочном приложении у меня есть следующий пример схемы, состоящей из двух таблиц и таблицы соединений с IdClass:

Company.java

@Entity
@Table(name = "COMPANY")
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany
    @LazyCollection(LazyCollectionOption.FALSE)
    @JoinTable(name = "COMPANY_2_LOCATIONS", joinColumns = {@JoinColumn(name = "COMPANY_ID", referencedColumnName = "ID")},
        inverseJoinColumns = {@JoinColumn(name = "LOCATION_ID", referencedColumnName = "ID")})
    private List<Location> locations;
    ...

}

Location.java

@Entity
@Table(name = "LOCATION")
public class Location {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    ...

}

Company2Locations.java

@Entity
@IdClass(Company2LocationsId.class)
@Table(name = "COMPANY_2_LOCATIONS")
public class Comany2Locations {

    @Id
    @ManyToOne
    @JoinColumn(name = "COMPANY_ID")
    @NotNull
    private Company company;

    @Id
    @ManyToOne
    @JoinColumn(name = "LOCATION_ID")
    @NotNull
    private Location location;
    ...
}

Company2LocationsId.java

public class Company2LocationsId{

    private Company company;
    private Location location;
    ...
}

Я хочу добавить отдельный идентификатор в таблицу соединений "Company2Locations", чтобы в таблице было три столбца:

  • ID // Отдельный идентификатор
  • COMPANY_ID
  • LOCATION_ID

Я попытался сделать следующее:

  1. Добавлен ID и сохранен @IdClass:

Company2Locations.java

@Entity
@IdClass(Company2LocationsId.class)
@Table(name = "COMPANY_2_LOCATIONS")
public class Comany2Locations {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Id
    @ManyToOne
    @JoinColumn(name = "COMPANY_ID")
    @NotNull
    private Company company;

    @Id
    @ManyToOne
    @JoinColumn(name = "LOCATION_ID")
    @NotNull
    private Location location;
    ...
}

Это обеспечивает исключение NullpointerException при запуске приложения.

Caused by: java.lang.NullPointerException: null
at org.hibernate.internal.util.StringHelper.root(StringHelper.java:374)
at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1832)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:46)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1775)
at org.hibernate.hql.internal.ast.tree.FromElement.getIdentityColumns(FromElement.java:352)
Добавил ID и удалил @IdClass и аннотацию @Id для местоположения и компании:

Company2Locations.java

@Entity
@Table(name = "COMPANY_2_LOCATIONS")
public class Comany2Locations {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "COMPANY_ID")
    @NotNull
    private Company company;

    @ManyToOne
    @JoinColumn(name = "LOCATION_ID")
    @NotNull
    private Location location;
    ...
}

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

Есть идеи, как добавить отдельный идентификатор в таблицу соединений?

1 Ответ

0 голосов
/ 27 июня 2018

Полагаю, это правильный ответ, опубликованный chris в качестве комментария:

Вы должны использовать Comany2Locations (sp) в своей модели как объект между компанией и местоположением, а не иметь ссылку на компанию Location напрямую.Внутри компании это должен быть OneToMany, использующий mappedby = "company"

...