私は、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に変わってしまいます。他のクラスもうまくいきます。