2

Place と PlaceShape という 2 つのエンティティがあります。PlaceShape は怠惰な 1 対 1 の関連付けとしてマークされており、Hibernate で完全に正常に動作します。ただし、(PlaceShape を読み込まずに) Place を編集して変更をコミットすると、Envers は PlaceShape を読み込んで差分を計算するようです。ただし、1 対多のコレクションはロードされません。PlaceShape は巨大なエンティティであり、特定の状況でロードする必要があるため、これがパフォーマンス関連の問題を引き起こしています。コール スタック トレース、SQL ログ、および Java コードを以下に示します。どんな助けや提案も大歓迎です。

ありがとう、

形状が取得されているスタック トレースは次のとおりです。

Place.getPlaceShape(Place.java:160)  
at sun.reflect.GeneratedMethodAccessor361.invoke(Unknown Source)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
at java.lang.reflect.Method.invoke(Method.java:601)  
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:172)  
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:175)  
at org.hibernate.envers.entities.mapper.MultiPropertyMapper.mapToMapFromEntity(MultiPropertyMapper.java:107)  
at org.hibernate.envers.synchronization.work.CollectionChangeWorkUnit.generateData(CollectionChangeWorkUnit.java:56)  
at org.hibernate.envers.synchronization.work.AbstractAuditWorkUnit.perform(AbstractAuditWorkUnit.java:72)  
at org.hibernate.envers.synchronization.AuditProcess.executeInSession(AuditProcess.java:114)  
at org.hibernate.envers.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:152)  
at org.hibernate.engine.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:543)  
at org.hibernate.engine.ActionQueue.beforeTransactionCompletion(ActionQueue.java:216)  
at org.hibernate.impl.SessionImpl.beforeTransactionCompletion(SessionImpl.java:571)  
at org.hibernate.jdbc.JDBCContext.beforeTransactionCompletion(JDBCContext.java:250)  
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:138)  
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)

上記の操作の SQL ログは次のとおりです。

select place0_.PID as PID1_10_6_, place0_.NAME as NAM2_10_6_ from PLACE place0_ where place0_.PID=?;  
update PLACE (NAME) values (?);  
select hibernate_sequence.nextval from dual;  
select placeshape0_.SPATIAL_ID as SPATIAL1_19_7_, placeshape0_.PID as PID3_19_7_, placeshape0_.SHAPE as SHAPE19_7_, place1_.PID as PID1_10_0_, place1_.NAME as NAM2_10_0_ from PLACE_SHAPE placeshape0_ left outer join PLACE place1_ on placeshape0_.PID=place1_.PID where placeshape0_.PID=?;  
insert into Revinfo (log, revtstmp, username, rev) values (?, ?, ?, ?);  
insert into PLACE_AUD (REVTYPE, NAME, PID, REV) values (?, ?, ?, ?);

エンティティのコードは次のとおりです。

@Entity  
@Audited  
@Table(name = "PLACE")  
public class Place implements FieldHandled {  
    private long pid;  
    private String name;   
    private PlaceShape placeShape;  
    private FieldHandler fieldHandler;  
    @Id  
    @Column(name = "PID", columnDefinition = "NUMBER(10,0)", nullable = false)  
    public long getPid() {  
        return pid;  
    }  

    public void setPid(long pid) {  
        this.pid = pid;   
    }  

    @Column(name = "NAME", columnDefinition = "NVARCHAR(100)", nullable = true)  
     public String getName() {  
         return name;  
     }  

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

    @OneToOne(mappedBy = "place", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, optional = true)  
    @LazyToOne(value = LazyToOneOption.NO_PROXY)  
    public PlaceShape getPlaceShape() {  
        if (fieldHandler != null) {  
            return (PlaceShape) fieldHandler.readObject(this, "placeShape", placeShape);  
        }  
        return placeShape;  
    }  

    public void setPlaceShape(PlaceShape placeShape) {  
        if (fieldHandler != null) {  
            this.placeShape = (PlaceShape) fieldHandler.writeObject(this, "placeShape", this.placeShape, placeShape);  
            return;  
        }  
        this.placeShape = placeShape;  
    }  
}  

@Audited  
@Entity  
@Table(name = "PLACE_SHAPE")  
public class PlaceShape implements Serializable {  
    private long id;  
    private Place place;  
    private Geometry shape;  

    @Id  
    @SequenceGenerator(name = "SEQ_STORE", sequenceName = "SPATIAL_SEQ", allocationSize = 1)  
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STORE")  
    @Column(name = "SPATIAL_ID", columnDefinition = "NUMBER(10, 0)", nullable = false)  
    public long getId() {  
        return id;  
    }  

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

    @OneToOne(fetch = FetchType.EAGER)  
    @JoinColumn(name = "PID", referencedColumnName = "PID")  
    public Place getPlace() {  
        return place;  
    }  

    public void setPlace(Place place) {  
        this.place = place;  
    }  

    @Type(type = "org.hibernatespatial.GeometryUserType")  
    @Column(name = "SHAPE", columnDefinition = "MDSYS.SDO_GEOMETRY", nullable = false)  
    public Geometry getShape() {  
        return shape;  
    }  

    public void setShape(Geometry shape) {  
        this.shape = shape;  
    }  
}
4

1 に答える 1

0

注釈を使用できます。

@org.hibernate.envers.NotAudited

javadoc:

フィールドに適用された場合、このフィールドが監査されるべきではないことを示します

于 2013-09-04T21:10:53.287 に答える