В моем весеннем загрузочном приложении у меня есть следующий пример схемы, состоящей из двух таблиц и таблицы соединений с 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
Я попытался сделать следующее:
- Добавлен 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;
...
}
Теперь приложение запускается, и я могудобавить места в компании.Но идентификаторы не генерируются, и столбец идентификаторов содержит нулевое значение.
Есть идеи, как добавить отдельный идентификатор в таблицу соединений?