2016-12-08 1 views
3

私は、ModelMapperフレームワークとSpringとHibernate 4を組み合わせた実際には奇妙な動作をしています。そして、2日間の検索でもまだ少し混乱しています。そのような奇妙な行動。HibernateTemplateでSpringで使用されているModelMapperの奇妙な動作

私はクラスA、クラスB、およびユーザークラスの3つのクラスを持っています。

Userクラス:

@Entity 
@Table(name = "users") 
@Data 
@EqualsAndHashCode(of = "id") 
@NoArgsConstructor 
@AllArgsConstructor 
@Builder 
public class User implements UserDetails { 
    @Id 
    @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name = "uuid", strategy = "uuid2") 
    private String id; 

... 
} 

クラスB:

@Entity 
@Audited 
@Table 
@Data 
@Builder 
@EqualsAndHashCode(of = "id") 
@AllArgsConstructor 
@NoArgsConstructor 
public class B implements Serializable{ 

    @Id 
    @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name = "uuid", strategy = "uuid2") 
    private String id; 

... 

    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(/*some join definition*/) 
    private Set<A> a; 
} 

クラスA:私は、コードの下に持っている私のコントローラで

@Entity 
@Audited 
@Table 
@Data 
@Builder 
@EqualsAndHashCode(of = "id") 
@AllArgsConstructor 
@NoArgsConstructor 
public class A implements Serializable{ 
    @Id 
    @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name = "uuid", strategy = "uuid2") 
    private String id; 

    ... 
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "user_id") 
    private User user; 

    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(/*some join definition*/) 
    private Set<User> subscribers; 
} 

List<B> bObjects = bService.findAll(); 
return modelMapper.map(bObjects, new TypeToken<List<BDto>>() { 
}.getType()); 

そして、データベースが削除されて再作成された後、最初に実行されたクエリに問題があります。 データベースをドロップしてアプリケーションを実行し、AクラスとBクラスの新しいオブジェクトを追加します。私のテーブルにあるすべてのオブジェクトをリストしようとすると、ModelMapperはUserクラスオブジェクトの代わりにnullを返します。すべての最初の実行はnullを返します。再起動すると、ユーザーは適切にマッピングされます。さらに、UserControllerを使用してすべてのユーザーを返すと、すべてのユーザーがcorectlyを返し、alプロパティが正しくマップされます。 クラスBのオブジェクトにクラスAの関係が含まれ、クラスAのこれらのオブジェクトは、アプリケーションの最初の実行でも正しく返されます。

これらのエンティティは熱心に読み込まれます。したがって、休止状態にする必要があります。 AをADに変換する標準コンバータを使用すると、すべて正常に動作します。 Converterは、ハードコードの行が含まれています

aDtoObject.setUserDto(aObject.getUser()); 

私は私のApplicationStartUpクラスのデフォルトのユーザーを挿入します。

私の休止状態の設定のプロパティ:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect 
hibernate.showSql=false 
hibernate.formatSql=false 
hibernate.hbm2ddl.auto=update 
hibernate.jdbc.batchSize=100 
hibernate.orderInserts=true 
hibernate.orderUpdates=true 
hibernate.jdbc.batchVersionedData=true 
hibernate.ejb.event.post-insert = org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener 
hibernate.ejb.event.post-update = org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener 
hibernate.ejb.event.post-delete = org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener 
hibernate.ejb.event.pre-collection-update = org.hibernate.envers.event.AuditEventListener 
hibernate.ejb.event.pre-collection-remove = org.hibernate.envers.event.AuditEventListener 
hibernate.ejb.event.post-collection-recreate = org.hibernate.envers.event.AuditEventListener 

ModelMapperの設定:

@Configuration 
public class ModelMapperConfig { 

    @Bean 
    public ModelMapper strictModelMapper() { 
     ModelMapper modelMapper = new ModelMapper(); 
     modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STANDARD); 
     return modelMapper; 
    } 
} 

POM:

 <spring-version>4.2.4.RELEASE</spring-version> 
     <hibernate-version>4.3.8.Final</hibernate-version> 

    <dependency> 
     <groupId>org.modelmapper</groupId> 
     <artifactId>modelmapper</artifactId> 
     <version>0.7.5</version> 
    </dependency> 


    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>${hibernate-version}</version> 
    </dependency> 


    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-envers</artifactId> 
     <version>${hibernate-version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>${hibernate-version}</version> 
    </dependency> 

誰もがそれを把握するために私を助けることができますか?どのようなアイデアをチェックすればよいのでしょうか?そのような奇妙な行動の理由は何ですか?

P.S. Userクラスだけでudnerlineに変わってしまいます。他のクラスもうまくいきます。

答えて

0

ご使用の構成クラスであることを行っていない包みます。また、お使いのモデルマッパーにマッピングを追加する必要があります - あなたがモデルマッパーを定義しても、設定します()メソッドをオーバーライド考えると

modelMapper.addMappings(new OutputMapper()); 

あなたが設定を取得していますPropertyMapで個別に属性をマップする:

class OutputMapper extends PropertyMap<AData, Output> { 

    @Override 
    protected void configure(){ 

    map().setABCD(source.getABCD()); 

    } 
} 
関連する問題