Могу ли я использовать аннотацию @Where вместе с ассоциацией @ManytoOne? - PullRequest
0 голосов
/ 26 июня 2019

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

1 Ответ

0 голосов
/ 28 июня 2019

Аннотация @Where не влияет на отношения ToOne.Но вместо добавления @Where к ссылке вы можете использовать @Where для Entity:

@Where(clause="isdeleted = 0")
@Entity
@Table(name = "storerole")
public class StoreRoleModel {

Таким образом, Hibernate не будет загружать удаленные объекты StoreRoleModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...