У меня следующая иерархия:
AbstractUserModel. java
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "user_type" , discriminatorType = DiscriminatorType.STRING)
@JsonTypeInfo (use = JsonTypeInfo.Id.NAME , property = "userType" , visible = true)
@JsonSubTypes ({@JsonSubTypes.Type(value = TouristUserModel.class, name = AbstractUserModel.TOURIST),
@JsonSubTypes.Type(value = BusinessUserModel.class, name = AbstractUserModel.BUSINESSMAN)})
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public abstract class AbstractUserModel
{
public static final String TOURIST = "tourist";
public static final String BUSINESSMAN = "businessman";
@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
@NotNull
@Column(name = "user_name", length = 50)
protected String name;
@NotNull
@Min(0)
@Column(name = "age")
protected Integer age;
...
TouristUserModel. java
@Entity
@DiscriminatorValue(AbstractUserModel.TOURIST)
@JsonTypeName(value = AbstractUserModel.TOURIST)
public class TouristUserModel extends AbstractUserModel
{
}
BusinessUserModel. java
@Entity
@DiscriminatorValue(AbstractUserModel.BUSINESSMAN)
@JsonTypeName(value = AbstractUserModel.BUSINESSMAN)
public class BusinessUserModel extends AbstractUserModel
{
}
Как мне обновить столбец UserType (user_type в БД)? Например, превратите туриста в бизнесмена.
В примерах @DiscriminatorColumn
, которые я видел, ни у одного из них не было различающего столбца в качестве поля в своей модели. У меня также были разные проблемы, когда я пытался поместить это как поле в свою модель, так что, вероятно, это не рабочее решение.
Если это вам поможет, я использую Spring Boot 2.2.6 и Spring Data JPA для обработки уровня данных.