2013-01-24 54 views
0

“必须实现继承的抽象方法”我在我的类AbstractJpaDao方法

@Override 
public EntityManager getEntityManager() { 
    return em; 
} 

现在是不是在使用,我想删除它,但我得到的错误:

类型JpaAclIdentityDao必须在类JpaAclIdentityDao中实施继承的抽象方法IJpaDao.getEntityManager()

是必要的getter?如果不是如何删除它

我的代码:

public abstract class AbstractJpaDao implements IJpaDao { 

protected final IApplicationConfig config; 

protected final EntityManager em; 

private final SingletonEventBus eventBus; 

public AbstractJpaDao(EntityManager entityManager, IApplicationConfig config, SingletonEventBus eventBus) { 
    checkArgument(entityManager != null); 
    checkArgument(config != null); 
    checkArgument(eventBus != null); 
    this.em = entityManager; 
    this.config = config; 
    this.eventBus = eventBus; 
} 

protected void saveEntity(IEntity entity) { 
    boolean isNew = entity.getId() == 0; 
    em.getTransaction().begin(); 
    try { 
     em.persist(entity); 
     em.getTransaction().commit(); 
     if (isNew) { 
      eventBus.post(new EntityCreatedEvent(entity)); 
     } 
    } finally { 
     if (em.getTransaction().isActive()) { 
      em.getTransaction().rollback(); 
     } 
    } 
} 



@Repository 
public class JpaAclIdentityDao extends AbstractJpaDao implements IAclIdentityDao { 



    public static final String GROUP_NAME_PATTERN = "GROUP_%d"; 

    private static final String GROUP_TEMP_NAME = "TEMP_GROUP_NAME"; 

@Inject 
public JpaAclIdentityDao(EntityManager entityManager, IApplicationConfig config, SingletonEventBus eventBus) { 
    super(entityManager, config, eventBus); 
} 

@Override 
public AclIdentity findById(Object id) throws EntityNotFoundException { 
    return em.find(AclIdentity.class, id); 
} 

@Override 
public List<AclIdentity> findAll() { 
    return findAllByType(AclIdentity.class); 
} 

@Override 
public void delete(AclIdentity entity) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void save(AclIdentity entity) { 
    saveEntity(entity); 
} 

@Override 
public AclIdentity createNew(String sid, boolean principal) { 
    AclIdentity identity = new AclIdentity(sid, principal); 
    save(identity); 
    return identity; 
} 

@Override 
public AclIdentity createNew(User entity) { 
    return createNew(entity.getEmail(), true); 
} 

@Override 
public AclIdentity createNew(Group entity) { 
    AclIdentity identity = createNew(GROUP_TEMP_NAME, false); 
    identity.setSid(String.format(GROUP_NAME_PATTERN, identity.getId())); 
    save(identity); 
    return identity; 
} 

}

回答

2

方法getEntityManagerIJpaDao(或一个超级接口)中定义,这就是为什么您需要在您的类中提供它的实现。

如果根本不使用它(即使通过您正在使用的某些框架内的某种反射机制),那么您可以从IJpaDao中删除它,并且您不会被强制执行它。

+0

这么愚蠢的错误...非常感谢您的快速回答 – akuzma

1

我猜测接口IJpaDao包含getEntityManager抽象方法。

4

是的,你必须实现在实现的接口中定义的所有方法。我能想到的唯一可能的解决方案是实现该方法并将其保留为空,或者不实现该接口。 或者,正如ben75所说的,如果你不需要它(任何地方),就删除你的界面声明中的方法“IJpaDao”。

2

如果你不想使用它,然后抛出UnsupportedOperationException:

public class JpaAclIdentityDao extends AbstractJpaDao ... { // Or AbstractJpaDao... 

    // Some Code... 

    public EntityManager getEntityManager() { 
     throw new UnsupportedOperationException(); 
     // return null; (This is not needed, due to the exception thrown above. Thanks dedek!) 
    } 

    // More Code... 
} 

由于OO编程,如果一个具体的类继承了抽象方法的类/接口,你必须定义该方法,或者让你的类抽象化并将其传递给线程,就像你使用AbstractJpaDao一样。

+0

'返回null;'在这种情况下是无用的 – dedek

+0

是啊...我在某些情况下得到代码OCD,所以这就是为什么我添加那。 –

相关问题