Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibirnate:无法使用@Transactional惰性初始化角色集合_Java_Spring_Spring Boot_Hibernate_Hibernate Mapping - Fatal编程技术网

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
    工作