EER Diagram
Я не эксперт в Spring, JPA, Hibernate или MySql.Однако я использую все для веб-службы, поддерживающей вызовы RESTful.Я создаю бэкэнд приложения для управления магазином с помощью Spring.На данный момент моими сущностями являются StoreModel, StoreUserModel, StoreUserRoleModel и StoreUserAuthModel.
У меня настроены двунаправленные отношения (OneToMany и ManyToOne) между StoreModel - StoreUserAuthModel, StoreUserMode - StoreUserAuthModelserAuseMuselser 100Store.useMuselserser.useMuselser и 100M.* Я не хочу ограничения внешнего ключа, хотя в StoreUserAuthModel есть поля внешнего ключа storeid, roleid и userid.
Теперь во всех четырех таблицах есть столбец isdeleted для реализации мягкого удаления.Я лениво выбираю ассоциации.Однако я не хочу, чтобы значения softdeleted всякий раз, когда я запрашиваю ассоциации.
Я хотел бы знать, могу ли я использовать аннотацию @Where вместе с аннотацией @ManyToOne в сущности StoreUserAuthModel?
Проблемаотличается от Как использовать @Where в Hibernate , потому что моя проблема связана с аннотацией ManyToOne, тогда как я использовал аннотацию where с OneToMany
@Entity
@Table(name = "store")
public class StoreModel {
@NotBlank
private String name;
@NotBlank
private String address;
@NotBlank
private String city;
@NotBlank
private String phone;
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "storeid", foreignKey = @ForeignKey(name="none", value = ConstraintMode.NO_CONSTRAINT ))
@Where(clause="isdeleted = 0")
private List<StoreUserAuthModel> authList = new ArrayList<StoreUserAuthModel>();
...
}
@Entity
@Table(name = "storerole")
public class StoreRoleModel {
@NotBlank
private String name;
@NotBlank
private Integer rolehierarchy;
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "roleid", foreignKey = @ForeignKey(name="none", value = ConstraintMode.NO_CONSTRAINT ))
@Where(clause="isdeleted = 0")
private List<StoreUserAuthModel> authList = new ArrayList<StoreUserAuthModel>();
...
}
@Entity
@Table(name = "storeuser")
public class StoreUserModel{
@NotBlank
@Column(unique = true)
private String username;
@Email
@Column(unique = true)
private String useremail;
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "userid", foreignKey = @ForeignKey(name="none", value = ConstraintMode.NO_CONSTRAINT ))
@Where(clause="isdeleted = 0")
List<StoreUserAuthModel> userAuthList = new ArrayList<StoreUserAuthModel>();
...
}
@Entity
@Table(name = "storeuserauth",
uniqueConstraints = @UniqueConstraint(columnNames = {"storeid", "roleid", "userid"}))
public class StoreUserAuthModel {
@NotNull
Long storeid;
@NotNull
Long roleid;
@NotNull
Long userid;
// Using @where to filter out the soft deleted storeuser
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="userid", foreignKey = @ForeignKey(name="none", value = ConstraintMode.NO_CONSTRAINT ),insertable = false, updatable = false )
@Where(clause="isdeleted = 0")
private StoreUserModel storeuser;
// Using @where to filter out the soft deleted store
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="storeid", foreignKey = @ForeignKey(name="none", value = ConstraintMode.NO_CONSTRAINT ),insertable = false, updatable = false )
@Where(clause="isdeleted = 0")
private StoreModel store;
// Using @where to filter out the soft deleted role
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="roleid", foreignKey = @ForeignKey(name="none", value = ConstraintMode.NO_CONSTRAINT ),insertable = false, updatable = false )
@Where(clause="isdeleted = 0")
private StoreRoleModel role;
...
}
// In the controller, Following code shows how I plan to use
Optional<StoreUserModel> aUser = storeUserRepository.findByUseremailAndIsdeleted(zUserMail), 0);
if(aUser.isPresent()) {
// The user was found!!!
// Testing...
// Getting the User Auth List (that will filter out the soft deleted auths)
List<StoreUserAuthModel> authList = aUser.get().getUserAuthList();
for(StoreUserAuthModel auth :authList) {
StoreModel store = auth.getStore();
// here both soft deleted store as well as normal stores are shown.
// ie where clause on store relation is not working!!
logger.debug("Store is "+store.getName());
}
}
...
Теперь все строки магазина, соответствующие идентификатору,в списке.Ожидаемый результат должен применяться и к предложению where
Я включил ведение журнала для спящего режима 5.3.9 Предложение where отсутствует при запуске запроса select