Java Hibirnate:无法使用@Transactional惰性初始化角色集合
我有这样一个问题:当我懒洋洋地加载集合时,它会抛出一个异常。我使用了Java Hibirnate:无法使用@Transactional惰性初始化角色集合,java,spring,spring-boot,hibernate,hibernate-mapping,Java,Spring,Spring Boot,Hibernate,Hibernate Mapping,我有这样一个问题:当我懒洋洋地加载集合时,它会抛出一个异常。我使用了Transactional注释,Hibernate.initialize,但在加载集合时仍然会出现错误。只有急切的帮助,但使用起来太贵了 实体: public class Release extends AbstractEntity { ... @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "releas
Transactional
注释,Hibernate.initialize
,但在加载集合时仍然会出现错误。只有急切的帮助,但使用起来太贵了
实体:
public class Release extends AbstractEntity {
...
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "releases_artists",
joinColumns = @JoinColumn(name = "release_id"),
inverseJoinColumns = @JoinColumn(name = "artist_id")
)
private Set<Artist> artists = new HashSet<>();
...
}
公共类发布扩展了AbstractEntity{
...
@ManyToMany(fetch=FetchType.LAZY)
@可接合(
name=“释放艺术家”,
joinColumns=@JoinColumn(name=“release\u id”),
inverseJoinColumns=@JoinColumn(name=“artist\u id”)
)
私有集艺术家=新HashSet();
...
}
引发异常的类:
@Transactional
public class ReleaseXmlReader extends XmlReaderArrays<Release> {
...
@Override
protected void handle(Release release) {
Release releaseFromDb = releaseRepository
.findFirstByFonalId(release.getFonalId()).orElse(null);
if (releaseFromDb != null) {
for (Artist artist : release.getArtists()) {
if (releaseFromDb.getArtists() <-- HERE
.stream()
.noneMatch(artist1 -> artist1.getDiscogsArtistId() != null)
) {
....
releaseRepository.save(releaseFromDb);
}
}
@Transactional
公共类ReleaseXmlReader扩展了XmlReaderArray{
...
@凌驾
受保护的空心把手(释放){
releaseFromDb=releaseRepository
.findFirstByFonalId(release.getFonalId()).orElse(null);
if(releaseFromDb!=null){
for(艺术家:release.getArtists()){
if(releaseFromDb.getArtists()artist1.GetDiscogArtistId()!=null)
) {
....
releaseRepository.save(releaseFromDb);
}
}
父抽象类:
@Transactional
public abstract class XmlReaderArrays<T extends AbstractEntity> {
....
public void parse() {
try {
XMLStreamReader reader = XMLInputFactory
.newInstance()
.createXMLStreamReader(inputStream);
XmlMapper mapper = new XmlMapper();
while (next(reader)) {
limit--;
try {
T obj = mapper.readValue(reader, type);
handle(obj); <--- HERE
} catch (Exception e) {
log.error("Error parse xml", e);
}
}
} catch (Exception e) {
log.error("Error parse xml", e);
}
}
...
}
@Transactional
公共抽象类XmlReaderArray{
....
公共空解析(){
试一试{
XMLStreamReader reader=XMLInputFactory
.newInstance()
.createXMLStreamReader(inputStream);
XmlMapper mapper=新的XmlMapper();
while(下一个(读卡器)){
限制--;
试一试{
T obj=mapper.readValue(读取器,类型);
handle(obj);为了使@Transactional
工作,spring AOP需要在您的bean上创建一个代理。这里有两个问题:
这里您没有使用bean,只是使用handle
作为同一类的方法。您必须注入bean以将其用作代理
该方法受保护
,但它必须是公共
,才能使@Transactional
工作