Hibernate Inheritance Save: saveOrUpdate и Merge генерируют огромное количество SELECT - PullRequest
0 голосов
/ 31 октября 2011


мои занятия в следующей структуре. супер класс:

@EntityListeners(OnSaveListeners.class)
@Table(name = "DISPUNIT")
@Entity


@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class DistributedUnit  extends AbstractEntity {
    private static CompositeMetaData  metadata = (CompositeMetaData)MetaData.forName(DistributedUnit.class);

    @Transient
    public CompositeMetaData getMetaData(){
        return metadata;
    }

    public static final transient String FLD_UNIT_LEVEL = "unitLevel";

    private  DistributedUnitLevel unitLevel = DistributedUnitLevel.EXIT04;


    public void setUnitLevel(DistributedUnitLevel unitLevel){
            this.unitLevel = unitLevel;
    }

    public DistributedUnitLevel getUnitLevel(){
        return this.unitLevel;
    }

    public static final transient String FLD_CODE = "code";

    @Column(nullable = false)
    @NotNull
    private  String code;


    public void setCode(String code){
            this.code = code;
    }

    public String getCode(){
        return this.code;
    }

    public static final transient String FLD_NAME = "name";

    private  String name;


    public void setName(String name){
            this.name = name;
    }

    public String getName(){
        return this.name;
    }

    public static final transient String FLD_TYPE = "type";

    private  UnitType type = UnitType.PUBLIC;


    public void setType(UnitType type){
            this.type = type;
    }

    public UnitType getType(){
        return this.type;
    }

    public static final transient String FLD_INSTALL_DATE = "installDate";

    @Temporal(TemporalType.TIMESTAMP)
    private  Date installDate;


    public void setInstallDate(Date installDate){
            this.installDate = installDate;
    }

    public Date getInstallDate(){
        return this.installDate;
    }

    public static final transient String FLD_NOTE = "note";

    private  String note;


    public void setNote(String note){
            this.note = note;
    }

    public String getNote(){
        return this.note;
    }

    public static final transient String FLD_REALTY = "realty";

    @ManyToOne(targetEntity = Realty.class, fetch = FetchType.LAZY)
    private  Realty realty;


    public void setRealty(Realty realty){
            this.realty = realty;
    }

    public Realty getRealty(){
        return this.realty;
    }

    public static final transient String FLD_CHILDREN = "children";

    @IndexColumn(base = 0, name = "idx_children_parent")
    @OneToMany(targetEntity = DistributedUnit.class, mappedBy = "parent")
    private  List<DistributedUnit> children = new ArrayList<DistributedUnit>();

    public void setChildren(List<DistributedUnit> children){

        List<DistributedUnit> preparedChildren = getChildren();
        if(preparedChildren != null ){
            preparedChildren.clear();
            preparedChildren.addAll(children);
        }else{
            this.children = children;
        }
    }

    public void addChildrenValue(DistributedUnit value){
        if(getChildren() == null) {
            setChildren( new ArrayList<DistributedUnit>()); 
        }
        getChildren().add(value);
        value.setParent(this);
    }

    public List<DistributedUnit> getChildren(){
        return this.children;
    }

    public static final transient String FLD_PARENT = "parent";

    @ManyToOne(targetEntity = DistributedUnit.class)
    private  DistributedUnit parent;


    public void setParent(DistributedUnit parent){
            this.parent = parent;
    }

    public DistributedUnit getParent(){
        return this.parent;
    }

    public static final transient String FLD_IDX_CHILDREN_PARENT = "idx_children_parent";

    private  Integer idx_children_parent;


    public void setIdx_children_parent(Integer idx_children_parent){
            this.idx_children_parent = idx_children_parent;
    }

    public Integer getIdx_children_parent(){
        return this.idx_children_parent;
    }


    /** Technical Fields **/

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

    private String roleId;

    private Date creationDate ;

    private Date updateDate;

    @Version
    private int version ;

    private String creatorUser;

    private String updatorUser;

    private String departmentId;

    private String owner;

    private String ownerRole;


    public String getOwner() {
        return owner;
    }

    public String getOwnerRole() {
        return ownerRole;
    }

    public void setOwner(String owner) {
        this.owner = owner;

    }

    public void setOwnerRole(String ownerRole) {
        this.ownerRole = ownerRole;
    }

    public void setId(Long id){
        this.id = id;
    }

    public Long getId(){
        return this.id;
    }

    public String getRoleId() {
        return roleId;
    }

    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public Date getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    public String getCreatorUser() {
        return creatorUser;
    }

    public void setCreatorUser(String creatorUser) {
        this.creatorUser = creatorUser;
    }

    public String getUpdatorUser() {
        return updatorUser;
    }

    public void setUpdatorUser(String updatorUser) {
        this.updatorUser = updatorUser;
    }

    public String getDepartmentId() {
        return departmentId;
    }

    public void setDepartmentId(String departmentId) {
        this.departmentId = departmentId;
    }

}

----------------------------------------------- --------------------------------------------...

один из подклассов:

@EntityListeners(OnSaveListeners.class)
@Entity
@PrimaryKeyJoinColumn(name="id")
public class TransStation extends DistributedUnit {
    private static CompositeMetaData  metadata = (CompositeMetaData)MetaData.forName(TransStation.class);

    @Transient
    public CompositeMetaData getMetaData(){
        return metadata;
    }



}

Я работаю с Hibernate и база данных является оракулом. У меня есть большой объем данных> когда я пытаюсь отредактировать TransStation, то после первого выбора, который hibernate использует для определения, является ли объект новым или существовал, я получаю огромное количество команд SELECT

любая помощь, пожалуйста

1 Ответ

0 голосов
/ 31 октября 2011

Я не внимательно посмотрел на код, но это

".. поэтому после первого выбора, который hibernate использует для определения, является ли объект новым или существовал, я получаю огромное количество команд SELECT .."

заставляет меня думать, что здесь есть какая-то проблема n + 1.Я не знаю, что вы делаете в своем коде, но я бы попробовал, чтобы обновить сущность, сначала загрузите ее из базы данных, используя ее идентификатор - поэтому Hibernate не придется проверять, существует ли она уже или нет, а затем изменять ее свойства., а затем сохранить его.Если по какой-либо причине вы все еще видите большое количество выборок, убедитесь, что тип выборки коллекций является LAZY (хотя я знаю, что LAZY может вызвать n + 1 проблем в других частях вашего приложения ... похоже, что Hibernate, по крайней мере, версияс которой я работаю, не разрешает разные режимы выборки для разных вариантов использования ..)

Надеюсь, это хотя бы подсказывает, где искать ..

...